Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^4: the '..' operator and decreasing values

by merlyn (Sage)
on Mar 04, 2005 at 22:35 UTC ( [id://436790]=note: print w/replies, xml ) Need Help??


in reply to Re^3: the '..' operator and decreasing values
in thread the '..' operator and decreasing values

From perl586delta:
"for (reverse @foo)" now iterates in reverse, avoiding the gene +ration of a temporary reversed list.

-- Randal L. Schwartz, Perl hacker
Be sure to read my standard disclaimer if this is a reply.

Replies are listed 'Best First'.
Re^5: the '..' operator and decreasing values
by lidden (Curate) on Mar 05, 2005 at 02:13 UTC
    It seems perl586delta fooled lots of us. I did som testing and it turns out that reverse 0..100 will turn 0..100 to a list of 101 elements and traverse that list from the end.
    for ( reverse 0 .. 100_000_000) {};
    Wants to grab lots of memory and gets killed by my OS, without reverse it works nicely. Tried with perl5.8.6 and perl5.9.1.
      And you guys are reporting this bug to perl5-porters, right?
        There's no bug. As of 5.8.6 (or maybe 5.8.5, didn't check that) the reverse is indeed optimized away. However, the .. operator is still evaluated to produce the full list (at compile time). So there's a potential for optimizing that away also, but you can't actually call it a bug.
Re^5: the '..' operator and decreasing values
by Tanktalus (Canon) on Mar 05, 2005 at 00:41 UTC

    I was about to post a benchmark, then I noticed that you were referring to 5.8.6. So I decided that now would be a good time to upgrade. So I did - spent the last little bit compiling, testing, and installing perl 5.8.6. Then I realised that my benchmark wasn't actually testing for, just the creation and reversing of the list. So, comparing them, I'd have to say that something just went wrong.

    use strict; use Benchmark qw(cmpthese); cmpthese(-1, { forward => sub { for (0 .. 10) {}; }, backward => sub { for (reverse 0 .. 10) {}; }, } );
    Noting that "perl" is perl 5.8.6, and "perl5.8.5" is, obviously, perl 5.8.5, and the script is called "y" (because I'm lazy):
    $ perl y Rate backward forward backward 182237/s -- -13% forward 210436/s 15% -- $ perl5.8.5 y Rate backward forward backward 234216/s -- -9% forward 256000/s 9% --
    Two things - first off, the difference between perl 5.8.6 and 5.8.5 is more significant than the difference between forward and backward, and the difference between forward and backward is actually worse. Granted, this is just a lazy list of numbers, not an actual array of scalars, but it's still somewhat disconcerting. Perhaps the P5P team put in a premature optimisation? ;-)

    Note that I reran the test with this code:

    use strict; use Benchmark qw(cmpthese); my @a = 0..100; cmpthese(-1, { forward => sub { for (@a) {}; }, backward => sub { for (reverse @a) {}; }, } );
    Again, perl 5.8.5 is faster than 5.8.6 here:
    $ perl y Rate backward forward backward 39822/s -- -12% forward 45189/s 13% -- $ perl5.8.5 y Rate backward forward backward 44799/s -- -3% forward 46089/s 3% --
    I would have expected, though, that perl 5.8.6 would have statistically-insignficant difference in speed between forward and backward iteration. That does not seem to be the case - 5.8.6 made the difference in speed worse vs 5.8.5.

    This is all based on a valid benchmark test - which is why I post the code. Anyone have anything that I might be missing, please tell me.

    Both 5.8.5 and 5.8.6 were compiled on the same OS, with nearly every option set to whatever default Configure sets them to, and the exception is something they both share: install path. Only difference I can think of is that 5.8.6 has a longer @INC, as it includes the 5.8.5 directories, but I don't see how that would play into this benchmark.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (6)
As of 2024-04-25 07:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found