Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Prettier Benchmarking for Ruby

tree: 588f7726dd
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 |
  # ----------------------------------
  
  
Something went wrong with that request. Please try again.