Benchmarkモジュールでベンチマークテスト

複数の実装方法のどちらが速いかな?とRubyで調べたいときには、Benchmarkモジュールが便利です。
1〜nまでの和を計算する二つの方法を比較してみましょう。以下のプログラムでは、足し算を本当に繰り返して求める方法(method1)と、公式を使って計算で求める方法(method2)の二者の速度を比較しています。

require 'benchmark'

def method1(n)
  sum = 0
  1.upto(n) do |k|
    sum += k
  end
  sum
end

def method2(n)
  (1 + n) * n / 2
end

n = 100_000
Benchmark.bm(7) do |x|
  x.report('case A') { method1(n) }
  x.report('case B') { method2(n) }
end

実行例です。

             user     system      total        real
case A   0.156000   0.000000   0.156000 (  0.157000)
case B   0.000000   0.000000   0.000000 (  0.000000)
  • Benchmarkのクラスメソッドbmに与えている引数7は、繰り返し回数ではなく、見出し行の先頭オフセット量です。
  • bmの呼び出しに対応づけられたブロックの引数xには、Benchmark::Reportオブジェクトが渡されてきますが、あまり気にする必要はありません。