-> [ruby-src:lib/benchmark.rb]
ベンチマークを取るためのクラスです。
Benchmark.measure { ... }
Benchmark.realtime { ... }
与えられたブロックを実行して、経過した時間を Process::times() で計り、 Benchmark::Tms オブジェクトを生成して返します。 Tms オブジェクトには to_s が定義されているので、基本的には以下のように 使います。
require 'benchmark' puts Benchmark::CAPTION puts Benchmark.measure { "a"*1_000_000 } => user system total real 1.166667 0.050000 1.216667 ( 0.571355)
Benchmark.bm(label_width = 0, *labels) {|rep| ... }
benchmark メソッドの引数を簡略化したものです。benchmark メソッドと同様に働きます。
require 'benchmark' n = 50000 Benchmark.bm do |x| x.report { for i in 1..n; a = "1"; end } x.report { n.times do ; a = "1"; end } x.report { 1.upto(n) do ; a = "1"; end } end => user system total real 1.033333 0.016667 1.016667 ( 0.492106) 1.483333 0.000000 1.483333 ( 0.694605) 1.516667 0.000000 1.516667 ( 0.711077)
以下のようにも書けます。
require 'benchmark' n = 50000 Benchmark.bm(7) do |x| x.report("for:") { for i in 1..n; a = "1"; end } x.report("times:") { n.times do ; a = "1"; end } x.report("upto:") { 1.upto(n) do ; a = "1"; end } end => user system total real for: 1.050000 0.000000 1.050000 ( 0.503462) times: 1.533333 0.016667 1.550000 ( 0.735473) upto: 1.500000 0.016667 1.516667 ( 0.711239)
Benchmark.bmbm(width = 0) {|job| ... }
Benchmark::Job オブジェクトを生成して、それを引数として与えられたブロックを 実行します。ベンチマークの実行時の隔たりを防ぐため、ブロックを2回実行します。 最初は Rehearsal として表示されます。
require 'benchmark' array = (1..1000000).map { rand } Benchmark.bmbm do |x| x.report("sort!") { array.dup.sort! } x.report("sort") { array.dup.sort } end => Rehearsal ----------------------------------------- sort! 11.928000 0.010000 11.938000 ( 12.756000) sort 13.048000 0.020000 13.068000 ( 13.857000) ------------------------------- total: 25.006000sec user system total real sort! 12.959000 0.010000 12.969000 ( 13.793000) sort 12.007000 0.000000 12.007000 ( 12.791000)
Benchmark.benchmark(caption = "", label_width = nil, fmtstr = nil, *labels){|rep| ...}
Benchmark::Report オブジェクトを生成し、それを引数として与えられたブロックを実行します。 基本的には以下のように使います。ブロックが Benchmark::Tms オブジェクトの配列を返した場合は、 それらの数値も追加の行に表示されます。
require 'benchmark' n = 50000 # これは # Benchmark.bm(7, ">total:", ">avg:") do |x| ... end # と同じ Benchmark.benchmark(" "*7 + Benchmark::CAPTION, 7, Benchmark::FMTSTR, ">total:", ">avg:") do |x| tf = x.report("for:") { for i in 1..n; a = "1"; end } tt = x.report("times:") { n.times do ; a = "1"; end } tu = x.report("upto:") { 1.upto(n) do ; a = "1"; end } [tf+tt+tu, (tf+tt+tu)/3] end => user system total real for: 1.016667 0.016667 1.033333 ( 0.485749) times: 1.450000 0.016667 1.466667 ( 0.681367) upto: 1.533333 0.000000 1.533333 ( 0.722166) >total: 4.000000 0.033333 4.033333 ( 1.889282) >avg: 1.333333 0.011111 1.344444 ( 0.629761)
fmtstr には、printf に似たフォーマット文字列を指定します。 フォーマット文字列として以下が使用できます。
fmtstr を省略したときは Benchmark::FMTSTR が使用されます。 その内容は
"%10.6u %10.6y %10.6t %10.6r\n"
です。