benchwarmer icon indicating copy to clipboard operation
benchwarmer copied to clipboard

Prettier Benchmarking for Ruby

benchwarmer

===========

A gem that provides a nice DSL for a common type of benchmark.

Specifically:

require "rubygems" require "benchwarmer"

TIMES = 100_000

Benchmark.warmer(TIMES) do # [1] columns :one, :two, :three # [2] titles :one => "Option 1", :three => "Option 3" # [3]

group("Squeezing") do                                 # [4]
  report "with #squeeze" do                           # [5]
    one { "abc//def//ghi//jkl".squeeze("/") }         # [6]
    two { "abc///def///ghi///jkl".squeeze("/") }
    three { "abc////def////ghi////jkl".squeeze("/") }
  end
  report "with #gsub" do
    one { "abc//def//ghi//jkl".gsub(/\/+/, "/") }
    two { "abc///def///ghi///jkl".gsub(/\/+/, "/") }
    three { "abc////def////ghi////jkl".gsub(/\/+/, "/") }
  end
end

group("Spliting") do
  report "with #split" do
    one { "aaa/aaa/aaa.bbb.ccc.ddd".split(".") }
    two { "aaa//aaa//aaa.bbb.ccc.ddd.eee".split(".") }
    three { "aaa///aaa///aaa.bbb.ccc.ddd.eee.fff".split(".") }
  end
  report "with #match" do
    one { "aaa/aaa/aaa.bbb.ccc.ddd".match(/\.([^\.]*)$/) }
    two { "aaa//aaa//aaa.bbb.ccc.ddd.eee".match(/\.([^\.]*)$/) }
    three { "aaa///aaa///aaa.bbb.ccc.ddd.eee.fff".match(/\.([^\.]*)$/) }
  end
end

end

[1] Specify the number of times you want to run each benchmark

[2] Specify the column names. By default, they will be displayed as upcased

versions of themselves.

[3] Specify prettier titles via a Hash. You do not need to specify the

same column in both columns and titles.

[4] Specify a group of benchmarks you wish to run

[5] Specify the name of the report you wish to run

[6] Optionally, specify several different variants of the benchmark. This could

be useful if you're testing a new alorithm, and wish to compare a bunch of

benchmarks against each algorithms. In most cases, you will probably want to

use the variant below, which does not require columns.

Output:

Running the benchmarks 100000 times each...

Option 1 | TWO | Option 3 |

-----------------------------------------------------

Squeezing with #squeeze 0.15 | 0.15 | 0.14 |

with #gsub 0.38 | 0.35 | 0.36 |

-----------------------------------------------------

Spliting with #split 0.43 | 0.51 | 0.61 |

with #match 0.29 | 0.35 | 0.38 |

-----------------------------------------------------

Benchmark.warmer(TIMES) do
group("Squeezing") do
report "with #squeeze" do
"abc//def//ghi//jkl".squeeze("/") end report "with #gsub" do "abc//def//ghi//jkl".gsub(//+/, "/") end end

group("Spliting") do
  report "with #split" do
    "aaa/aaa/aaa.bbb.ccc.ddd".split(".")
  end
  report "with #match" do
    "aaa/aaa/aaa.bbb.ccc.ddd".match(/\.([^\.]*)$/)
  end
end

end

Output:

Running the benchmarks 100000 times each...

Results |

---------------------------------

Squeezing with #squeeze 0.15 |

with #gsub 0.37 |

---------------------------------

Spliting with #split 0.43 |

with #match 0.29 |

---------------------------------

Benchmark.warmer(TIMES) do report "squeezing with #squeeze" do "abc//def//ghi//jkl".squeeze("/") end report "squeezing with #gsub" do "abc//def//ghi//jkl".gsub(//+/, "/") end end

Output:

Running the benchmarks 100000 times each...

Results |

----------------------------------

squeezing with #squeeze 0.15 |

squeezing with #gsub 0.34 |

----------------------------------