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