Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby2.5でのパフォーマンスの向上

新しいRubyバージョンは改善を続けており、Ruby2.5も例外ではありません。

ルビー2.5 これらの最適化を紹介します:

  • 大きな文字列を作成すると、文字列の補間が約72%高速になります
  • 引数を1つだけ指定すると、String#prependが約42%高速になります
  • Enumerable#sort_by、Enumerable#min_by、およびEnumerable#max_byは約50%高速になります

いくつかのベンチマークを見てみましょう!

文字列補間のパフォーマンス

この最適化のコミットメッセージのサンプルコードを使用しました:

require 'benchmark/ips'

Benchmark.ips do |x|
  x.report "Large string interpolation" do |t|
    a = "Hellooooooooooooooooooooooooooooooooooooooooooooooooooo"
    b = "Wooooooooooooooooooooooooooooooooooooooooooooooooooorld"

    t.times { "#{a}, #{b}!" }
  end

  x.report "Small string interpolation" do |t|
    a = "Hello"
    b = "World"

    t.times { "#{a}, #{b}!" }
  end

  x.compare!
end

このベンチマークを実行したところ、次の結果が得られました。

ルビー2.4.1

Small string interpolation:  3236291.1 i/s
Large string interpolation:  1711633.4 i/s - 1.89x  slower

ルビー2.5

Small string interpolation:  3125175.1 i/s
Large string interpolation:  2555782.6 i/s - 1.22x  slower

ご覧のとおり、大きな文字列の違いはかなり顕著です!

String#prepend Performance

prependメソッドを使用すると、配列の前にテキストを挿入できます。

Ruby 2.5は、最も一般的なケースに最適化され、1つの文字列のみを別の文字列の前に追加します。

これがベンチマーク結果です。

Ruby 2.4.1の結果:

String#prepend  3.428M (± 3.2%) i/s - 17.159M in   5.011008s

Ruby 2.5の結果:

String#prepend  4.638M (± 3.6%) i/s - 23.276M in   5.025562s

これはかなり良い改善です!

列挙可能なパフォーマンスの向上

いくつかの列挙可能なメソッドがパフォーマンスをアップグレードしています。

この特定の最適化は、<=>のメソッドディスパッチをスキップするため機能します メソッド。

コミットメッセージで説明されているように:

"<=>の代わりに、OPTIMIZED_CMP()を使用してオブジェクトを比較します Fixnum / Float/Stringオブジェクトのメソッドディスパッチ。"

これが私のベンチマーク結果です。

ルビー2.4.2

Enumerable#sort_by    2.395k (± 6.7%) i/s - 11.952k in   5.014422s
Enumerable#min_by     8.244k (± 6.1%) i/s - 41.405k in   5.042327s
Enumerable#max_by     8.053k (± 6.7%) i/s - 40.180k in   5.015375s

ルビー2.5

Enumerable#sort_by    5.914k (± 6.7%) i/s  - 29.786k in   5.062584s
Enumerable#min_by     15.668k (± 3.0%) i/s - 78.888k in   5.039748s
Enumerable#max_by     15.544k (± 2.3%) i/s - 78.408k in   5.046709s

これは約50%の改善です🙂

Range#min&Range#max

私はあなたのために2つのボーナスパフォーマンス最適化を持っています!

1つは、Range#minとRange#maxのメソッドに関するものです。

ベンチマークは次のとおりです。

ルビー2.4.2

Range#min    7.976M (± 3.0%) i/s - 39.950M in   5.013242s
Range#max    7.996M (± 3.4%) i/s - 40.059M in   5.015984s

ルビー2.5

Range#min   13.154M (± 3.0%) i/s -  65.731M in   5.002094s
Range#max  13.021M (± 2.6%) i/s  -  65.202M in   5.010924s

ここでコミットを見つけてください。

改良されたString#scan

コミットメッセージによると、これにより、文字列パターンで50%、正規表現パターンで10%パフォーマンスが向上します。

ベンチマークを見てみましょう!

ルビー2.4.2

String#scan - String pattern
       1.367M (±19.8%) i/s - 6.458M in   4.982047s
String#scan - Regex pattern
       1.228M (±17.0%) i/s - 5.881M in   4.983943s

ルビー2.5

String#scan - String pattern
      3.944M (±24.4%) i/s - 17.739M in   4.977417s
String#scan - Regex pattern
      1.696M (±17.4%) i/s -  8.103M in   4.982614s

より高速なスキャンをお楽しみください!

概要

12月25日にリリースされるRuby2.5の新しい最適化について学びました。

これらの最適化は、文字列補間、列挙可能なメソッド、String#prependに関するものです。 メソッド、String#scan メソッドとRange#max / Range#mix メソッド。

この投稿を楽しんでいただけたでしょうか。

投稿を共有することを忘れないでください お気に入りのソーシャルネットワークで🙂


  1. Rubyでのラムダの使用

    ブロックはRubyの非常に重要な部分であり、ブロックなしで言語を想像するのは難しいです。しかし、ラムダ?ラムダが好きなのは誰ですか?あなたはそれを使わずに何年も行くことができます。まるで過ぎ去った時代の遺物のようです。 ...しかし、それは完全に真実ではありません。ラムダを少し調べてみると、ラムダにはいくつかの興味深いトリックがあります。 この記事では、ラムダの使用法の基本から始めて、さらに興味深い高度な使用法に移ります。したがって、ラムダを毎日使用していて、それらについてすべて知っている場合は、下にスクロールするだけです。 Lambdasについて覚えておくべき主なことは、それらが関数の

  2. Ruby2.6の9つの新機能

    Rubyの新しいバージョンには、新しい機能とパフォーマンスの改善が含まれています。 変更についていきますか? 見てみましょう! 無限の範囲 Ruby 2.5以前のバージョンは、すでに1つの形式の無限範囲をサポートしています( Float ::INFINITY を使用) )、しかしRuby2.6はこれを次のレベルに引き上げます。 新しい無限の範囲 次のようになります: (1..) これは、(1..10)のような終了値がないため、通常の範囲とは異なります。 。 使用例 : [a, b, c].zip(1..) # [[a, 1], [b, 2], [c, 3]] [1,2,3,