summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog31
-rw-r--r--lib/benchmark.rb10
-rw-r--r--test/benchmark/test_benchmark.rb79
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 <naruse@ruby-lang.org>
+
+ * 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 <usa@ruby-lang.org>
* 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 = <<BENCH
- user system total real
-first --time-- --time-- --time-- ( --time--)
-second --time-- --time-- --time-- ( --time--)
-third --time-- --time-- --time-- ( --time--)
+ 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--)
+ 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--)
+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--)
+ 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