summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/benchmark.rb20
-rw-r--r--test/benchmark/test_benchmark.rb102
3 files changed, 69 insertions, 58 deletions
diff --git a/ChangeLog b/ChangeLog
index b61fbd12de..2361f805dd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Jul 18 12:55:54 2012 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/benchmark.rb: Fix Benchmark.benchmark output with an empty
+ caption. patched by Benoit Daloze. [ruby-core:45719] [Bug #6610]
+
Wed Jul 18 10:00:54 2012 Eric Hodel <drbrain@segment7.net>
* lib/debug.rb: Added toplevel documentation. Based on patch by Oscar
diff --git a/lib/benchmark.rb b/lib/benchmark.rb
index 7def252a85..f52ba7df34 100644
--- a/lib/benchmark.rb
+++ b/lib/benchmark.rb
@@ -169,7 +169,7 @@ module Benchmark
label_width ||= 0
label_width += 1
format ||= FORMAT
- print ' '*label_width + caption
+ print ' '*label_width + caption unless caption.empty?
report = Report.new(label_width, format)
results = yield(report)
Array === results and results.grep(Tms).each {|t|
@@ -284,7 +284,7 @@ module Benchmark
t1.stime - t0.stime,
t1.cutime - t0.cutime,
t1.cstime - t0.cstime,
- r1.to_f - r0.to_f,
+ r1 - r0,
label)
end
@@ -485,13 +485,13 @@ module Benchmark
#
def format(format = nil, *args)
str = (format || FORMAT).dup
- str.gsub!(/(%[-+\.\d]*)n/) { "#{$1}s" % label }
- str.gsub!(/(%[-+\.\d]*)u/) { "#{$1}f" % utime }
- str.gsub!(/(%[-+\.\d]*)y/) { "#{$1}f" % stime }
- str.gsub!(/(%[-+\.\d]*)U/) { "#{$1}f" % cutime }
- str.gsub!(/(%[-+\.\d]*)Y/) { "#{$1}f" % cstime }
- str.gsub!(/(%[-+\.\d]*)t/) { "#{$1}f" % total }
- str.gsub!(/(%[-+\.\d]*)r/) { "(#{$1}f)" % real }
+ str.gsub!(/(%[-+.\d]*)n/) { "#{$1}s" % label }
+ str.gsub!(/(%[-+.\d]*)u/) { "#{$1}f" % utime }
+ str.gsub!(/(%[-+.\d]*)y/) { "#{$1}f" % stime }
+ str.gsub!(/(%[-+.\d]*)U/) { "#{$1}f" % cutime }
+ str.gsub!(/(%[-+.\d]*)Y/) { "#{$1}f" % cstime }
+ str.gsub!(/(%[-+.\d]*)t/) { "#{$1}f" % total }
+ str.gsub!(/(%[-+.\d]*)r/) { "(#{$1}f)" % real }
format ? str % args : str
end
@@ -554,7 +554,7 @@ if __FILE__ == $0
n = ARGV[0].to_i.nonzero? || 50000
puts %Q([#{n} times iterations of `a = "1"'])
- benchmark(" " + CAPTION, 7, FORMAT) do |x|
+ benchmark(CAPTION, 7, FORMAT) do |x|
x.report("for:") {for _ in 1..n; _ = "1"; end} # Benchmark.measure
x.report("times:") {n.times do ; _ = "1"; end}
x.report("upto:") {1.upto(n) do ; _ = "1"; end}
diff --git a/test/benchmark/test_benchmark.rb b/test/benchmark/test_benchmark.rb
index 801da47dae..7477fa8e05 100644
--- a/test/benchmark/test_benchmark.rb
+++ b/test/benchmark/test_benchmark.rb
@@ -4,7 +4,7 @@ require 'benchmark'
MiniTest::Unit.autorun
describe Benchmark do
- BENCH_FOR_TIMES_UPTO = lambda do |x|
+ bench_for_times_upto = lambda do |x|
n = 1000
tf = x.report("for:") { for _ in 1..n; '1'; end }
tt = x.report("times:") { n.times do ; '1'; end }
@@ -12,21 +12,23 @@ describe Benchmark do
[tf+tt+tu, (tf+tt+tu)/3]
end
- BENCH_FOR_TIMES_UPTO_NO_LABEL = lambda do |x|
+ bench_for_times_upto_no_label = lambda do |x|
n = 1000
x.report { for _ in 1..n; '1'; end }
x.report { n.times do ; '1'; end }
x.report { 1.upto(n) do ; '1'; end }
end
- LABELS = %w[first second third]
+ def labels
+ %w[first second third]
+ end
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
@@ -59,12 +61,29 @@ describe Benchmark do
end
end
+ benchmark_output_with_total_avg = <<BENCH
+ 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
+
describe 'benchmark' do
+ it 'does not print any space if the given caption is empty' do
+ capture_bench_output(:benchmark).must_equal <<-BENCH
+first --time-- --time-- --time-- ( --time--)
+second --time-- --time-- --time-- ( --time--)
+third --time-- --time-- --time-- ( --time--)
+BENCH
+ end
+
it 'makes extra calcultations with an Array at the end of the benchmark and show the result' do
capture_bench_output(:benchmark,
Benchmark::CAPTION, 7,
Benchmark::FORMAT, ">total:", ">avg:",
- &BENCH_FOR_TIMES_UPTO).must_equal BENCHMARK_OUTPUT_WITH_TOTAL_AVG
+ &bench_for_times_upto).must_equal benchmark_output_with_total_avg
end
end
@@ -74,8 +93,8 @@ describe Benchmark do
capture_io do
results = bench(meth)
results.must_be_instance_of Array
- results.size.must_equal LABELS.size
- results.zip(LABELS).each { |tms, label|
+ results.size.must_equal labels.size
+ results.zip(labels).each { |tms, label|
tms.must_be_instance_of Benchmark::Tms
tms.label.must_equal label
}
@@ -84,26 +103,49 @@ describe Benchmark do
end
it 'correctly output when the label width is given' do
- capture_bench_output(:bm, 6).must_equal BM_OUTPUT
+ capture_bench_output(:bm, 6).must_equal <<-BENCH
+ user system total real
+first --time-- --time-- --time-- ( --time--)
+second --time-- --time-- --time-- ( --time--)
+third --time-- --time-- --time-- ( --time--)
+BENCH
end
it 'correctly output when no label is given' do
- capture_bench_output(:bm, &BENCH_FOR_TIMES_UPTO_NO_LABEL).must_equal BM_OUTPUT_NO_LABEL
+ capture_bench_output(:bm, &bench_for_times_upto_no_label).must_equal <<-BENCH
+ user system total real
+ --time-- --time-- --time-- ( --time--)
+ --time-- --time-- --time-- ( --time--)
+ --time-- --time-- --time-- ( --time--)
+BENCH
end
it 'can make extra calcultations with an array at the end of the benchmark' do
capture_bench_output(:bm, 7, ">total:", ">avg:",
- &BENCH_FOR_TIMES_UPTO).must_equal BENCHMARK_OUTPUT_WITH_TOTAL_AVG
+ &bench_for_times_upto).must_equal benchmark_output_with_total_avg
end
end
describe 'bmbm' do
+ bmbm_output = <<BENCH
+Rehearsal ------------------------------------------
+first --time-- --time-- --time-- ( --time--)
+second --time-- --time-- --time-- ( --time--)
+third --time-- --time-- --time-- ( --time--)
+--------------------------------- total: --time--sec
+
+ user system total real
+first --time-- --time-- --time-- ( --time--)
+second --time-- --time-- --time-- ( --time--)
+third --time-- --time-- --time-- ( --time--)
+BENCH
+
it 'correctly guess the label width even when not given' do
- capture_bench_output(:bmbm).must_equal BMBM_OUTPUT
+ capture_bench_output(:bmbm).must_equal bmbm_output
end
it 'correctly output when the label width is given (bmbm ignore it, but it is a frequent mistake)' do
- capture_bench_output(:bmbm, 6).must_equal BMBM_OUTPUT
+ capture_bench_output(:bmbm, 6).must_equal bmbm_output
end
end
@@ -125,39 +167,3 @@ describe Benchmark do
end
end
end
-
-BM_OUTPUT = <<BENCH
- user system total real
-first --time-- --time-- --time-- ( --time--)
-second --time-- --time-- --time-- ( --time--)
-third --time-- --time-- --time-- ( --time--)
-BENCH
-
-BM_OUTPUT_NO_LABEL = <<BENCH
- user system total real
- --time-- --time-- --time-- ( --time--)
- --time-- --time-- --time-- ( --time--)
- --time-- --time-- --time-- ( --time--)
-BENCH
-
-BMBM_OUTPUT = <<BENCH
-Rehearsal ------------------------------------------
-first --time-- --time-- --time-- ( --time--)
-second --time-- --time-- --time-- ( --time--)
-third --time-- --time-- --time-- ( --time--)
---------------------------------- total: --time--sec
-
- user system total real
-first --time-- --time-- --time-- ( --time--)
-second --time-- --time-- --time-- ( --time--)
-third --time-- --time-- --time-- ( --time--)
-BENCH
-
-BENCHMARK_OUTPUT_WITH_TOTAL_AVG = <<BENCH
- 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