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)
もっと良いモジュールあるよ!というご助言、などがあれば、
ご指導いただければありがたいです。