Do you remeber how to use the benchmark library from the Ruby standard
lib? I don’t.
Now you need not to remember, there is Bench: A DSL around the benchmark
lib of the Ruby
standard lib with the goal to make benchmarking as easy as possible.
== SYNOPSIS
Adapted example of the benchmark documentation from the pickaxe version
2
page 657
require ‘bench’
string = ‘Stormy Weather’
m = string.method(:length)
Do you remeber how to use the benchmark library from the Ruby standard
lib? I don’t.
Now you need not to remember, there is Bench: A DSL around the
benchmark
lib of the Ruby standard lib with the goal to make benchmarking as
easy as possible.
If I don’t remember how to use the benchmark library, why would I
remember how to use your DSL?
That is what ri is for. ri Benchmark obviates the need for Bench.
What is the underlying translation of benchmark? I.e. the original
Benchmark library has a few different methods, which did you use? I
like the simplicity of your DSL. In the long run it might be nice to
see this advance beyond a dependency on the original benchmark
library.
If I don’t remember how to use the benchmark library, why would I
remember how to use your DSL?
Because it has only 2 commands: benchmark and run.
That is what ri is for. ri Benchmark obviates the need for Bench.
Maybe, but with bench it’s a pleasure to doing benchmarks interactive
with irb:
require ‘bench’
benchmark ‘simple’ do
?> /ll/ =~ ‘hello world’
end
benchmark ‘freezed’ do
?> /ll/.freeze =~ ‘hello world’
end
run 1000
user system total real
simple 0.000000 0.000000 0.000000 ( 0.003960)
freezed 0.010000 0.000000 0.010000 ( 0.004870)
run 1000
user system total real
simple 0.010000 0.000000 0.010000 ( 0.003969)
freezed 0.000000 0.000000 0.000000 ( 0.004624)
let’s try more iterations
?> run 10000
user system total real
simple 0.060000 0.000000 0.060000 ( 0.058049)
freezed 0.060000 0.000000 0.060000 ( 0.058636)
run 100000
user system total real
simple 0.500000 0.000000 0.500000 ( 0.502427)
freezed 0.540000 0.000000 0.540000 ( 0.533421)
now another benchmark sample
?> RE = /ll/
benchmark ‘constant’ do
?> RE =~ ‘hello world’
end
run
user system total real
simple 0.000000 0.000000 0.000000 ( 0.000031)
freezed 0.000000 0.000000 0.000000 ( 0.000469)
constant 0.000000 0.000000 0.000000 ( 0.000031)
What is the underlying translation of benchmark? I.e. the original
Benchmark library has a few different methods, which did you use? I like
the simplicity of your DSL. In the long run it might be nice to see this
advance beyond a dependency on the original benchmark library.
Let’s look at the code:
def run count=1
size = Bench.queue.inject(0) {|max, bm| size = bm.name.size; size >
max ? size : max}
Benchmark.bm(size) do |x|
Bench.queue.each do |bm|
x.report(bm.name) { count.times {bm.proc.call} }
end
end
end
Two methods of the original benchmark are called:
Benchmark.bm with an automatic calculated label_width (I don’t want to
think about that).
Benchmark::Report#report
You can call run as often as you want and do GC.start or whatever
before,
so you can simulate the Benchmark.bmbm method. That is enough for my
needs.