Skip to content

Instantly share code, notes, and snippets.

@Hampei
Created August 31, 2018 13:25
Show Gist options
  • Save Hampei/0cd44858eb4b9b380eb8bca9fe28bf74 to your computer and use it in GitHub Desktop.
Save Hampei/0cd44858eb4b9b380eb8bca9fe28bf74 to your computer and use it in GitHub Desktop.
benchmark for passing a block
require 'benchmark'
def once_yield
yield
end
def call_proc(proc)
proc.call
end
def proc_with_yield
call_proc -> { yield }
end
def proc_new
call_proc(Proc.new)
end
def block_that_yields
once_yield { yield }
end
def pass_block(&block)
once_yield &block
end
def pass_block_as_proc(&block)
call_proc block
end
n = 1000000
Benchmark.bm do |x|
x.report('proc_with_yield: ') { n.times { proc_with_yield { 1 + 1 } } }
x.report('proc_new: ') { n.times { proc_new { 1 + 1 } } }
x.report('block_that_yields: ') { n.times { block_that_yields { 1 + 1 } } }
x.report('pass_block: ') { n.times { pass_block { 1 + 1 } } }
x.report('pass_block_as_proc: ') { n.times { pass_block_as_proc { 1 + 1 } } }
end
# ruby 2.3.6 (similar for ruby 2.4.4):
# proc_with_yield: 1.160000 0.040000 1.200000 ( 1.201511)
# proc_new: 0.720000 0.010000 0.730000 ( 0.728715)
# block_that_yields: 0.120000 0.000000 0.120000 ( 0.125595)
# pass_block: 0.620000 0.020000 0.640000 ( 0.633641)
# pass_block_as_proc: 0.630000 0.010000 0.640000 ( 0.644798)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment