Sam Kong wrote: > Hello! > > As you know, in Ruby, a block is not an object for some reasons, one of > which is performance. > > def f > yield > end > > def g &blk > blk.call > end > > In g, a block is explicitly converted to a Proc object. > What about in f? > Is a block still converted to a Proc object implicitly? > > If it's not converted, I understand the performance issue. > However, it's always converted to a Proc object, I don't understand why > blocks improve performance just because they are not objects. > > Can somebody explain this, please? You've got the answer already, but it's interesting to see how much of a difference it makes: (YMMV, of course.) 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 __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) -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407