rubyfan
7/8/2006 7:46:00 PM
On 7/8/06, dblack@wobblini.net <dblack@wobblini.net> wrote:
> Hi --
>
> On Sun, 9 Jul 2006, Phil Tomson wrote:
>
> > On 7/8/06, William James <w_a_x_man@yahoo.com> wrote:
> >> Daniel Schierbeck wrote:
> >> > Why haven't I thought of this before?
> >> >
> >> > class Terminal
> >> > include Enumerable
> >> >
> >> > def each(&block)
> >> > while input = gets
> >> > block.call(input.chomp)
> >> > end
> >> > end
> >>
> >> def each
> >> while input = gets
> >> yield input.chomp
> >> end
> >> end
> >
> > Equivilent code, actually. It's a case of "you say tomaTOE I say tomAHto"
> > Personally, I tend to prefer the 'block.call' because you explicitly
> > say you're passing in a block in the definition of the method, so if
> > someone is reading your code they can easily tell that the method
> > takes a block. In the case of yield you might need to read through a
> > good bit of code before you find out that the method takes a block.
>
> It does seem that yielding is faster; note the effect of turning the
> block into a Proc object:
>
> require 'benchmark'
> include Benchmark
>
> n = 100000
>
> def y
> end
>
> def b(&block)
> end
>
> bm do |x|
> x.report("call") { n.times { b { } } }
> x.report("yield") { n.times { y { } } }
> end
>
> # Output:
>
> user system total real
> call 1.860000 0.040000 1.900000 ( 2.874001)
> yield 0.220000 0.000000 0.220000 ( 0.249164)
>
That is a fairly significant difference, so maybe I should revise my
statement to say that the two different ways acheive the same effect
ignoring differences in runtime ;-)
Phil