Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: Why is "for" much slower than "while"?

by gam3 (Curate)
on Jan 17, 2010 at 01:34 UTC ( #817806=note: print w/ replies, xml ) Need Help??


in reply to Why is "for" much slower than "while"?

I ran some benchmarks and I the real answer is that while <..> has been finely tuned. On a large file it is almost as fast as foreach over a list.

/dev/null
               Rate        for     whyfor      while while_list   for_list
for        374878/s         --       -13%       -15%       -55%       -62%
whyfor     433016/s        16%         --        -2%       -48%       -56%
while      442469/s        18%         2%         --       -47%       -55%
while_list 833025/s       122%        92%        88%         --       -16%
for_list   991880/s       165%       129%       124%        19%         --

/usr/share/dict/words
             Rate        for while_list     whyfor      while   for_list
for        4.80/s         --       -35%       -37%       -38%       -43%
while_list 7.40/s        54%         --        -2%        -5%       -13%
whyfor     7.57/s        58%         2%         --        -2%       -11%
while      7.75/s        62%         5%         2%         --        -9%
for_list   8.48/s        77%        15%        12%         9%         --

/etc/passwd
              Rate        for     whyfor      while while_list   for_list
for        14440/s         --       -13%       -16%       -24%       -49%
whyfor     16599/s        15%         --        -4%       -12%       -42%
while      17224/s        19%         4%         --        -9%       -39%
while_list 18915/s        31%        14%        10%         --       -33%
for_list   28442/s        97%        71%        65%        50%         --
#!/usr/bin/perl use strict; use Benchmark qw( cmpthese ); foreach my $file qw ( /dev/null /usr/share/dict/words /etc/passwd ) { open my $IN1, '<', $file or die "could not open $file"; my @list = <$IN1>; seek( $IN1, 0, 0 ); print "$file\n"; cmpthese( -5, { for_list => sub { my %counts = (); ++$counts{$_} for @list; die unless keys %counts == @list; }, while_list => sub { my $x = 0; my %counts = (); ++$counts{$_} while defined( $_ = $list[ $x++ ] ); die unless keys %counts == @list; }, for => sub { seek( $IN1, 0, 0 ); my %counts = (); ++$counts{$_} for <$IN1>; die unless keys %counts == @list; }, while => sub { seek( $IN1, 0, 0 ); my %counts = (); ++$counts{$_} while <$IN1>; die unless keys %counts == @list; }, whyfor => sub { seek( $IN1, 0, 0 ); my %counts = (); for ( ; defined( $_ = <$IN1> ) ; ) { ++$counts{$_}; } die unless keys %counts == @list; }, } ); }
-- gam3
A picture is worth a thousand words, but takes 200K.


Comment on Re: Why is "for" much slower than "while"?
Download Code
Replies are listed 'Best First'.
Re^2: Why is "for" much slower than "while"?
by Anonymous Monk on Jan 17, 2010 at 01:52 UTC
    Try
    whyfor2 => sub { seek( $IN1, 0, 0 ); my %counts = (); ++$counts{$_} for ( ; defined( $_ = <$IN1> ) ; ) ; die unless keys %counts == @list; },
Re^2: Why is "for" much slower than "while"?
by Xiong (Hermit) on Jan 24, 2010 at 00:08 UTC

    My results from gam3's script, second version:

    /dev/null
                    Rate        for     whyfor      while while_list   for_list
    for         280029/s         --       -16%       -17%       -73%       -74%
    whyfor      333697/s        19%         --        -1%       -68%       -69%
    while       338448/s        21%         1%         --       -68%       -69%
    while_list 1050567/s       275%       215%       210%         --        -3%
    for_list   1079903/s       286%       224%       219%         3%         --
    /usr/share/dict/words
                 Rate        for     whyfor while_list      while   for_list
    for        3.67/s         --       -39%       -41%       -42%       -51%
    whyfor     5.99/s        63%         --        -4%        -5%       -21%
    while_list 6.26/s        71%         5%         --        -0%       -17%
    while      6.27/s        71%         5%         0%         --       -17%
    for_list   7.56/s       106%        26%        21%        21%         --
    /etc/passwd
                  Rate     whyfor        for while_list      while   for_list
    whyfor     13584/s         --       -13%       -17%       -30%       -56%
    for        15664/s        15%         --        -5%       -19%       -49%
    while_list 16411/s        21%         5%         --       -15%       -47%
    while      19273/s        42%        23%        17%         --       -38%
    for_list   30882/s       127%        97%        88%        60%         --
    

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://817806]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (7)
As of 2015-07-30 11:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (271 votes), past polls