* 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
Родитель 9844bc02a0
Коммит 39b33658e3
3 изменённых файлов: 69 добавлений и 58 удалений

Просмотреть файл

@ -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> Wed Jul 18 10:00:54 2012 Eric Hodel <drbrain@segment7.net>
* lib/debug.rb: Added toplevel documentation. Based on patch by Oscar * lib/debug.rb: Added toplevel documentation. Based on patch by Oscar

Просмотреть файл

@ -169,7 +169,7 @@ module Benchmark
label_width ||= 0 label_width ||= 0
label_width += 1 label_width += 1
format ||= FORMAT format ||= FORMAT
print ' '*label_width + caption print ' '*label_width + caption unless caption.empty?
report = Report.new(label_width, format) report = Report.new(label_width, format)
results = yield(report) results = yield(report)
Array === results and results.grep(Tms).each {|t| Array === results and results.grep(Tms).each {|t|
@ -284,7 +284,7 @@ module Benchmark
t1.stime - t0.stime, t1.stime - t0.stime,
t1.cutime - t0.cutime, t1.cutime - t0.cutime,
t1.cstime - t0.cstime, t1.cstime - t0.cstime,
r1.to_f - r0.to_f, r1 - r0,
label) label)
end end
@ -485,13 +485,13 @@ module Benchmark
# #
def format(format = nil, *args) def format(format = nil, *args)
str = (format || FORMAT).dup str = (format || FORMAT).dup
str.gsub!(/(%[-+\.\d]*)n/) { "#{$1}s" % label } str.gsub!(/(%[-+.\d]*)n/) { "#{$1}s" % label }
str.gsub!(/(%[-+\.\d]*)u/) { "#{$1}f" % utime } str.gsub!(/(%[-+.\d]*)u/) { "#{$1}f" % utime }
str.gsub!(/(%[-+\.\d]*)y/) { "#{$1}f" % stime } str.gsub!(/(%[-+.\d]*)y/) { "#{$1}f" % stime }
str.gsub!(/(%[-+\.\d]*)U/) { "#{$1}f" % cutime } str.gsub!(/(%[-+.\d]*)U/) { "#{$1}f" % cutime }
str.gsub!(/(%[-+\.\d]*)Y/) { "#{$1}f" % cstime } str.gsub!(/(%[-+.\d]*)Y/) { "#{$1}f" % cstime }
str.gsub!(/(%[-+\.\d]*)t/) { "#{$1}f" % total } str.gsub!(/(%[-+.\d]*)t/) { "#{$1}f" % total }
str.gsub!(/(%[-+\.\d]*)r/) { "(#{$1}f)" % real } str.gsub!(/(%[-+.\d]*)r/) { "(#{$1}f)" % real }
format ? str % args : str format ? str % args : str
end end
@ -554,7 +554,7 @@ if __FILE__ == $0
n = ARGV[0].to_i.nonzero? || 50000 n = ARGV[0].to_i.nonzero? || 50000
puts %Q([#{n} times iterations of `a = "1"']) 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("for:") {for _ in 1..n; _ = "1"; end} # Benchmark.measure
x.report("times:") {n.times do ; _ = "1"; end} x.report("times:") {n.times do ; _ = "1"; end}
x.report("upto:") {1.upto(n) do ; _ = "1"; end} x.report("upto:") {1.upto(n) do ; _ = "1"; end}

Просмотреть файл

@ -4,7 +4,7 @@ require 'benchmark'
MiniTest::Unit.autorun MiniTest::Unit.autorun
describe Benchmark do describe Benchmark do
BENCH_FOR_TIMES_UPTO = lambda do |x| bench_for_times_upto = lambda do |x|
n = 1000 n = 1000
tf = x.report("for:") { for _ in 1..n; '1'; end } tf = x.report("for:") { for _ in 1..n; '1'; end }
tt = x.report("times:") { n.times do ; '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] [tf+tt+tu, (tf+tt+tu)/3]
end end
BENCH_FOR_TIMES_UPTO_NO_LABEL = lambda do |x| bench_for_times_upto_no_label = lambda do |x|
n = 1000 n = 1000
x.report { for _ in 1..n; '1'; end } x.report { for _ in 1..n; '1'; end }
x.report { n.times do ; '1'; end } x.report { n.times do ; '1'; end }
x.report { 1.upto(n) do ; '1'; end } x.report { 1.upto(n) do ; '1'; end }
end end
LABELS = %w[first second third] def labels
%w[first second third]
end
def bench(type = :bm, *args, &block) def bench(type = :bm, *args, &block)
if block if block
Benchmark.send(type, *args, &block) Benchmark.send(type, *args, &block)
else else
Benchmark.send(type, *args) do |x| Benchmark.send(type, *args) do |x|
LABELS.each { |label| labels.each { |label|
x.report(label) {} x.report(label) {}
} }
end end
@ -59,12 +61,29 @@ describe Benchmark do
end end
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 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 it 'makes extra calcultations with an Array at the end of the benchmark and show the result' do
capture_bench_output(:benchmark, capture_bench_output(:benchmark,
Benchmark::CAPTION, 7, Benchmark::CAPTION, 7,
Benchmark::FORMAT, ">total:", ">avg:", 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
end end
@ -74,8 +93,8 @@ describe Benchmark do
capture_io do capture_io do
results = bench(meth) results = bench(meth)
results.must_be_instance_of Array results.must_be_instance_of Array
results.size.must_equal LABELS.size results.size.must_equal labels.size
results.zip(LABELS).each { |tms, label| results.zip(labels).each { |tms, label|
tms.must_be_instance_of Benchmark::Tms tms.must_be_instance_of Benchmark::Tms
tms.label.must_equal label tms.label.must_equal label
} }
@ -84,26 +103,49 @@ describe Benchmark do
end end
it 'correctly output when the label width is given' do 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 end
it 'correctly output when no label is given' do 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 end
it 'can make extra calcultations with an array at the end of the benchmark' do it 'can make extra calcultations with an array at the end of the benchmark' do
capture_bench_output(:bm, 7, ">total:", ">avg:", 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
end end
describe 'bmbm' do 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 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 end
it 'correctly output when the label width is given (bmbm ignore it, but it is a frequent mistake)' do 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
end end
@ -125,39 +167,3 @@ describe Benchmark do
end end
end 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