Rubyの処理速度を確認したい時に使うGem【Benchmark-ips】

プログラムを組んでいると, 処理速度が気になったりします.
私もつい最近, 画面レスポンスが遅い処理を何とかしたくて試行錯誤したので, その時に使ったライブラリを紹介したいと思います.

それが, Rubyの処理速度を比較できる”Benchmark-ips”です.
早速使い方を見ていこうと思います.

Benchmark-ips

Benchmark-ipsは, RubyGem(Rubyのライブラリ)の一種です.
Githubはこちら.

使い方

まずはインストールです.

$ gem install benchmark-ips

次にRubyファイルでライブラリのロードを行い, Benchmark.ipsのブロック内に比較対象の処理を書いていきます.

require 'benchmark/ips'

Benchmark.ips do |x|
  x.report("each"){
    arr = [1,2,3]
    result = []
    arr.each do |a|
      result << a += 1
    end
  }
  x.report("map"){
    arr = [1,2,3]
    result = 
      arr.map do |a|
        a += 1
      end
  }
  x.compare!
end

上記はeachメソッドとmapメソッドそれぞれで, Arrayの各要素をインクリメントする処理を比較しています.
reportのブロック内に処理を書いていきます.

そして最後のcompare!によって処理速度順位が表示されます.
実際の実行結果を見てみましょう.

実行結果

Warming up --------------------------------------
                each   249.932k i/100ms
                 map   290.791k i/100ms
Calculating -------------------------------------
                each      2.544M (± 2.9%) i/s -     12.747M in   5.013943s
                 map      2.871M (± 5.2%) i/s -     14.540M in   5.083873s

Comparison:
                 map:  2870637.0 i/s
                each:  2544485.1 i/s - 1.13x  (± 0.00) slower

実行結果の見方を説明していきます.

Warming upから始まるのが100ms(ミリ秒)あたりの反復回数です.
Calculatingから始まるのが1s(秒)あたりの反復回数, すなわち1秒間に何回処理できるかを表します.

そしてComparisonから始まるのが, それぞれの処理のランキングです.

上記でいうとmapメソッドを使用した方が, より多く処理を反復できる(2.871M回)
また, eachメソッドの方はmapメソッドの1.13倍遅いということが分かります.

このように, Benchmark-ipsを使うことで処理速度比較ができ, 最適な処理選択の一助になりそうです.