1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/benchmark.rb: Fix Benchmark.benchmark output with an empty

caption.  patched by Benoit Daloze. [ruby-core:45719] [Bug #6610]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36427 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2012-07-18 03:56:58 +00:00
parent 9844bc02a0
commit 39b33658e3
3 changed files with 69 additions and 58 deletions

View file

@ -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

View file

@ -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}

View file

@ -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