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オブジェクトが渡されてきますが、あまり気にする必要はありません。