GitHub Sale: sign up for any paid plan this week and pay nothing until January 1, 2009!  [ hide ]

public
Description: Prettier Benchmarking for Ruby
Clone URL: git://github.com/wycats/benchwarmer.git
wycats (author)
Sun May 04 11:11:08 -0700 2008
commit  f9a9f3525d3994b0317ec7ab1a2a8c2baebe3782
tree    56dda391dc5a194bdd8ee310834e1720b0361309
parent  b4465784e9f6b828fa48f1fb94a685b3c1c661b0
name age message
file LICENSE Sat May 03 15:29:34 -0700 2008 Initial commit with actual code ;) [wycats]
file README Sun May 04 11:11:08 -0700 2008 Improve README [wycats]
file Rakefile Sat May 03 15:29:34 -0700 2008 Initial commit with actual code ;) [wycats]
file TODO Sat May 03 14:24:27 -0700 2008 newgem stub [wycats]
directory lib/ Sat May 03 16:31:20 -0700 2008 Fixes cases with anonymous groups and anonymous... [wycats]
directory script/ Sat May 03 14:24:27 -0700 2008 newgem stub [wycats]
directory spec/ Sat May 03 14:24:27 -0700 2008 newgem stub [wycats]
README
# 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 |
  # ----------------------------------