Ruby 2.5のパフォーマンス改善点(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Performance Improvements in Ruby 2.5 原文公開: 2017/11 著者: Jesus Castello サイト: http://www.rubyguides.com/ Ruby 2.5のパフォーマンス改善点(翻訳) Rubyは常に改善を繰り返しており、Ruby 2.5でも同様です。 Ruby 2.5でいくつかの最適化が行われました。 サイズの大きな文字列を作成したときの式展開が約72%高速化 String#prependの引数が1つだけの場合に約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 以下の結果を得ました。 Ruby 2.4.1: Small string interpolation: 3236291.1 i/s Large string interpolation: 1711633.4 i/s – 上より1.89倍遅い Ruby 2.5: Small string interpolation: 3125175.1 i/s Large string interpolation: 2555782.6 i/s – 上より1.22倍遅い 見てのとおり、サイズの大きな文字列でパフォーマンスがかなり向上しました。 String#prependのパフォーマンス prependメソッドは、arrayの先頭にテキストを挿入します。 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 これはなかなかの改善です。 Enumerableのパフォーマンス改善 いくつかのEnumerableメソッドでパフォーマンスが向上しました。 この最適化では<=>メソッドのディスパッチメソッドをスキップすることでパフォーマンスが向上します。 コミットメッセージには以下の記述があります。 Fixnum/Float/Stringオブジェクトへのディスパッチで、<=>メソッドではなくOPTIMIZED_CMP()を使う 同リンクより抄訳 ベンチマーク結果は次のとおりです。 Ruby 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 Ruby 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 … Continue reading Ruby 2.5のパフォーマンス改善点(翻訳)