From 4870feb31a6625dcbf8817ccf16294bb3f3737e1 Mon Sep 17 00:00:00 2001 From: naruse Date: Tue, 28 Jun 2011 06:09:46 +0000 Subject: * lib/benchmark.rb: merge eregon/benchmark. https://github.com/eregon/ruby/tree/benchmark patched by Benoit Daloze. [ruby-core:37593] [Bug #4940] * lib/benchmark (Benchmark#bmbm): bmbm should be consistent with bm for the return value. * test/benchmark: remove preemptive test instead of skipping I removed the preemptive test I wrote for Feature #4197. I'll add it back when the implementation will be able to satisfy it. * lib/benchmark (Benchmark#bmbm): remove useless explicit call, #format is an alias of #to_s test/benchmark: add a test for format of long time. * lib/benchmark: fix label width: always add 1 to ensure there is a space delimiter even with times over 100s When I asked for Feature #4197, I wanted to make delimiting spaces consistent for #bm and #bmbm. But with times over 100s, the output contains no space between the label and the first time (user). Now both ensure there is always a space, even if that means 3 spaces with times under 10s (because it is formatted as %10.6f) * test/benchmark: let labels be a constant lib/benchmark (Benchmark#realtime): avoid creating an unused Proc lib/benchmark (Benchmark#benchmark): use ensure clause to restore STDOUT.sync, as in #bmbm git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32269 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 31 ++++++++++++++++ lib/benchmark.rb | 10 +++-- test/benchmark/test_benchmark.rb | 79 +++++++++++++++++++--------------------- 3 files changed, 75 insertions(+), 45 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1408418e45..65f67b7c6e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,34 @@ +Tue Jun 28 15:09:21 2011 NARUSE, Yui + + * lib/benchmark.rb: merge eregon/benchmark. + https://github.com/eregon/ruby/tree/benchmark + patched by Benoit Daloze. [ruby-core:37593] [Bug #4940] + + * lib/benchmark (Benchmark#bmbm): bmbm should be consistent with bm + for the return value. + + * test/benchmark: remove preemptive test instead of skipping + I removed the preemptive test I wrote for Feature #4197. + I'll add it back when the implementation will be able to satisfy it. + + * lib/benchmark (Benchmark#bmbm): remove useless explicit call, + #format is an alias of #to_s test/benchmark: add a test for + format of long time. + + * lib/benchmark: fix label width: always add 1 to ensure there is a + space delimiter even with times over 100s + When I asked for Feature #4197, I wanted to make delimiting spaces + consistent for #bm and #bmbm. + But with times over 100s, the output contains no space between the + label and the first time (user). + Now both ensure there is always a space, even if that means 3 spaces + with times under 10s (because it is formatted as %10.6f) + + * test/benchmark: let labels be a constant + lib/benchmark (Benchmark#realtime): avoid creating an unused Proc + lib/benchmark (Benchmark#benchmark): use ensure clause to restore + STDOUT.sync, as in #bmbm + Tue Jun 28 13:41:51 2011 NAKAMURA Usaku * thread_win32.c (native_stop_timer_thread): fixed commit miss of diff --git a/lib/benchmark.rb b/lib/benchmark.rb index 5ca9db1661..6a00da1359 100644 --- a/lib/benchmark.rb +++ b/lib/benchmark.rb @@ -167,6 +167,7 @@ module Benchmark sync = STDOUT.sync STDOUT.sync = true label_width ||= 0 + label_width += 1 format ||= FORMAT print ' '*label_width + caption report = Report.new(label_width, format) @@ -174,8 +175,9 @@ module Benchmark Array === results and results.grep(Tms).each {|t| print((labels.shift || t.label || "").ljust(label_width), t.format(format)) } - STDOUT.sync = sync report.list + ensure + STDOUT.sync = sync unless sync.nil? end @@ -244,7 +246,7 @@ module Benchmark def bmbm(width = 0, &blk) # :yield: job job = Job.new(width) yield(job) - width = job.width + width = job.width + 1 sync = STDOUT.sync STDOUT.sync = true @@ -263,7 +265,7 @@ module Benchmark job.list.map { |label,item| GC.start print label.ljust(width) - Benchmark.measure(&item).tap { |res| print res.format } + Benchmark.measure(label, &item).tap { |res| print res } } ensure STDOUT.sync = sync unless sync.nil? @@ -288,7 +290,7 @@ module Benchmark # # Returns the elapsed real time used to execute the given block. # - def realtime(&blk) # :yield: + def realtime # :yield: r0 = Time.now yield Time.now - r0 diff --git a/test/benchmark/test_benchmark.rb b/test/benchmark/test_benchmark.rb index b34884fdc6..801da47dae 100644 --- a/test/benchmark/test_benchmark.rb +++ b/test/benchmark/test_benchmark.rb @@ -19,16 +19,14 @@ describe Benchmark do x.report { 1.upto(n) do ; '1'; end } end - def labels - %w[first second third] - end + LABELS = %w[first second third] def bench(type = :bm, *args, &block) if block Benchmark.send(type, *args, &block) else Benchmark.send(type, *args) do |x| - labels.each { |label| + LABELS.each { |label| x.report(label) {} } end @@ -50,6 +48,8 @@ describe Benchmark do Benchmark::Tms.new(1,2,3,4,5,'label').format('%u %y %U %Y %t %r %n').must_equal \ "1.000000 2.000000 3.000000 4.000000 10.000000 (5.000000) label" Benchmark::Tms.new(1).format('%u %.3f', 2).must_equal "1.000000 2.000" + Benchmark::Tms.new(100, 150, 0, 0, 200).to_s.must_equal \ + "100.000000 150.000000 250.000000 (200.000000)\n" end it 'wont modify the format String given' do @@ -70,22 +70,19 @@ describe Benchmark do describe 'bm' do it "returns an Array of the times with the labels" do - capture_io do - results = bench - results.must_be_instance_of Array - results.size.must_equal labels.size - results.zip(labels).each { |tms, label| - tms.must_be_instance_of Benchmark::Tms - tms.label.must_equal label - } + [:bm, :bmbm].each do |meth| + capture_io do + results = bench(meth) + results.must_be_instance_of Array + results.size.must_equal LABELS.size + results.zip(LABELS).each { |tms, label| + tms.must_be_instance_of Benchmark::Tms + tms.label.must_equal label + } + end end end - it 'correctly guess the label width even when not given' do - skip :not_implemented - capture_bench_output(:bm).must_equal BM_OUTPUT - end - it 'correctly output when the label width is given' do capture_bench_output(:bm, 6).must_equal BM_OUTPUT end @@ -130,37 +127,37 @@ describe Benchmark do end BM_OUTPUT = <total: --time-- --time-- --time-- ( --time--) ->avg: --time-- --time-- --time-- ( --time--) + user system total real +for: --time-- --time-- --time-- ( --time--) +times: --time-- --time-- --time-- ( --time--) +upto: --time-- --time-- --time-- ( --time--) +>total: --time-- --time-- --time-- ( --time--) +>avg: --time-- --time-- --time-- ( --time--) BENCH -- cgit v1.2.1