Tuesday, May 26, 2009

Ruby blocks - explicit vs implicit arguments

I wanted to pass an implicit block argument to a call to super. Looks like the most efficient way is to use the following:
def on_ready
  unless paused?
    super { yield }
  end
end

From http://www.ruby-forum.com/topic/71221

require 'benchmark'
def outer11(&bl)
  inner1(&bl)
end

def outer12(&bl)
  inner2(&bl)
end

def outer21
  inner1 { yield }
end

def outer22
  inner2 { yield }
end

def inner1(&bl)
  bl.call
end

def inner2
   yield
end

n = 100000

Benchmark.bmbm(10) do |rpt|
   rpt.report("outer11") do
   n.times {outer11{}}
end

rpt.report("outer12") do
   n.times {outer12{}}
end

rpt.report("outer21") do
   n.times {outer21{}}
end

rpt.report("outer22") do
   n.times {outer22{}}
end
end
Output:

Rehearsal ---------------------------------------------
outer11     0.890000   0.010000   0.900000 (  0.894500)
outer12     0.370000   0.000000   0.370000 (  0.364880)
outer21     0.770000   0.000000   0.770000 (  0.776638)
outer22     0.170000   0.000000   0.170000 (  0.163393)
------------------------------------ total: 2.210000sec

user     system      total        real
outer11     0.490000   0.000000   0.490000 (  0.491969)
outer12     0.400000   0.000000   0.400000 (  0.396264)
outer21     0.760000   0.000000   0.760000 (  0.764508)
outer22     0.160000   0.000000   0.160000 (  0.161982)

No comments: