_J Blog

学んだ事のまとめやメモなどが中心です

Rubyでベンチマークの平均などとれるモジュールをかいてみた

練習がてらに作ってみました。
下記がコードです。

require 'benchmark'
class BBenchmark
  def self.measure(n=1, &b)
    res = []
    Benchmark.benchmark(
      ' ' * 7 +Benchmark::CAPTION, 
      7,
      Benchmark::FORMAT, #1.8.x では Benchmark::FMTSTR
      'total:',
      'avg:'
      ) { |bm|
      n.times do |i|
        res << bm.report((i+1).to_s+':', &b)
      end
      puts '----------------------------------------------------'
      total = res.inject(Benchmark::Tms.new) { |sum, v| sum + v }
      [total, total/n]
    }
    puts '----------------------------------------------------'
    puts
  end
end

利用方法
Ruby標準のベンチマークモジュールとほぼ同じで、
Benchmark.measure の所を少し変更して下記のように書くだけです。

#()内は実施したい回数
BBenchmark.measure(20) {
  a = {hoge: 'moge', foo: 'bar'}.to_json
}

とすれば、以下の結果が出力されます。

             user     system      total        real
1:       0.000000   0.000000   0.000000 (  0.000653)
2:       0.000000   0.000000   0.000000 (  0.000351)
3:       0.000000   0.000000   0.000000 (  0.000311)
4:       0.000000   0.000000   0.000000 (  0.000310)
5:       0.000000   0.000000   0.000000 (  0.000312)
6:       0.000000   0.000000   0.000000 (  0.000325)
7:       0.000000   0.000000   0.000000 (  0.000317)
8:       0.000000   0.000000   0.000000 (  0.000321)
9:       0.010000   0.000000   0.010000 (  0.003624)
10:      0.000000   0.000000   0.000000 (  0.000200)
11:      0.000000   0.000000   0.000000 (  0.000389)
12:      0.000000   0.000000   0.000000 (  0.000206)
13:      0.000000   0.000000   0.000000 (  0.000254)
14:      0.000000   0.000000   0.000000 (  0.000123)
15:      0.000000   0.000000   0.000000 (  0.000152)
16:      0.000000   0.000000   0.000000 (  0.000123)
17:      0.000000   0.000000   0.000000 (  0.000123)
18:      0.000000   0.000000   0.000000 (  0.000117)
19:      0.000000   0.000000   0.000000 (  0.000118)
20:      0.000000   0.000000   0.000000 (  0.000131)
total:   0.010000   0.000000   0.010000 (  0.008460)
avg:     0.000500   0.000000   0.000500 (  0.000423)

もっと良いモジュールあるよ!というご助言、などがあれば、
ご指導いただければありがたいです。