Chas Owens wrote:
> On 4/19/07, Jenda Krynicky <[EMAIL PROTECTED]> wrote:
>> From: "Chas Owens" <[EMAIL PROTECTED]>
> snip
>> > foreach is dead, long live for.
>>
>> William is dead, long live Bill?
>>
>> foreach and for are two names for the same thing and just as you can
>> call someone both William and Bill you can use foreach and for
>> interchangeably.
>>
>> foreach(my $i = 0; $i < $whatever; $i++)
>> for(my $i = 0; $i < $whatever; $i++)
>>
>> for my $x (@array)
>> foreach my $x (@array)
>>
>> for (@array)
>> foreach (@array)
>>
>> No difference to the computer. Use whichever reads best!
> 
> Yes, foreach was aliased to for for backwards compatibility,

Huh?  Do you have something to back up that claim?

> but, like
> telnet and rsh, it should not be used in new code.

Really?  I assume you mean the protocols and not the programs?

>> I would myself use "for" for the C-style loops
> 
> And this is why.  As long as people think "well, I have foreach which
> is for iterating and for which is for C-style loops" they will
> continue to write C-style loops.  C-style loops are bad.  They are
> there for backwards compatibility.  I can't think of a single for loop
> that isn't better written as a range based for loop or while loop. For
> instance
> 
> standard range based loop
> for (my $i = 0; $i < 10; $i++) {}
> for my $i (0 .. 9) {}

How about:

for ( my $i = 0; $i < 10; $i += 3 ) {}

foreach my $i ( ? .. ? ) {}

> often $i winds up being used as an index which just makes me cringe.
> 
> The infinite loop
> for (;;) {}
> while (1) {}
> 
> The reason C programmers give for using for (;;) is that it generates
> less overhead on their platform, but, at least with my tests*,
> while(1) is more efficient in Perl.

I ran your benchmark on my computer and for(;;) and while(1) ran at about the
same speed.

$ perl -le'
use Benchmark;

my %subs = (
       for   => sub { my $i; for (;;) { last if $i++ > 1_000 } },
       while => sub { my $i; while (1) { last if $i++ > 1_000 } },
       bare  => sub { my $i; { last if $i++ > 1_000; redo }  },
);

Benchmark::cmpthese(-10, \%subs);
'
        Rate  bare   for while
bare  4471/s    --  -15%  -15%
for   5253/s   17%    --   -0%
while 5268/s   18%    0%    --

$ perl -le'
use Benchmark;

my %subs = (
       for   => q{ my $i; for (;;) { last if $i++ > 1_000 } },
       while => q{ my $i; while (1) { last if $i++ > 1_000 } },
       bare  => q{ my $i; { last if $i++ > 1_000; redo }  },
);

Benchmark::cmpthese(-10, \%subs);
'
        Rate  bare while   for
bare  4445/s    --  -15%  -15%
while 5219/s   17%    --   -0%
for   5233/s   18%    0%    --




John
-- 
Perl isn't a toolbox, but a small machine shop where you can special-order
certain sorts of tools at low cost and in short order.       -- Larry Wall

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to