Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re^2: counting backward (optimize foreach reverse low .. high

by Anonymous Monk
on Mar 02, 2013 at 15:13 UTC ( #1021425=note: print w/ replies, xml ) Need Help??


in reply to Re: counting backward
in thread counting backward

Which is okay for small ranges; but creates a huge list for large ones.

:) seems like an easy candidate for optimization , since this is optimized for (reverse @a) is optimized

perl -le " @f = 1 .. 100_000; for(reverse @f ){ $f=$_; $f==$#f and sca +lar<> } " perl -le " @f = 1 .. 100_000; for( @f ){ $f=$_; $f==$#f and scalar<> } + "


Comment on Re^2: counting backward (optimize foreach reverse low .. high
Download Code
Re^3: counting backward (optimize foreach reverse low .. high
by LanX (Canon) on Mar 02, 2013 at 15:24 UTC
    AFAIK for( @f ) is optimized to act like an iterator without expanding and caching the list.

    But in for(reverse @f ) there is no for-context which helps reverse to act differently.

    I'm to lazy for benchmarks (we had them before), but this was surely not fixed in 5.8.8

    Cheers Rolf

      You're wrong
      for(reverse @f) has been optimised not to expand the array since 5.10.0.

      Dave.

        Maybe it's optimized for reversing arrays but not for reversing ranges:

        I had to stop the second version because the swapping started to freeze my system:

        lanx@nc10-ubuntu:~$ perl -e'for my $i ( 0 .. 1e8 ) { $x*=-1; $x+=$i }; +print "$x\n"' 50000000 lanx@nc10-ubuntu:~$ perl -e'for my $i ( reverse 0 .. 1e8 ) { $x*=-1; $ +x+=$i };print "$x\n"' ^C^C^C lanx@nc10-ubuntu:~$ perl -version This is perl, v5.10.0 built for i486-linux-gnu-thread-multi ...

        Reversing ranges was what BUK did, but AnoMonk replied with a reference to a fix for reversing arrays!

        Cheers Rolf

Re^3: counting backward (optimize foreach reverse low .. high
by BrowserUk (Pope) on Mar 02, 2013 at 15:29 UTC

    But you still had to create a huge array in order to benefit from the optimisation; which kinda negates the purpose.

    This: perl -E"@a=1..1e9; for( reverse @a ) { print $_; <> }" consumes 18GB (that's Gigabytes!) of memory

    Whereas this: perl -E"for( -1e9..1 ) { print -$_; <> }" iterates the same range and consumes only 1.8MB of ram.

    Four orders of magnitude more memory, or a minus sign. My choice is simple; how about yours?


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

      Four orders of magnitude more memory, or a minus sign. My choice is simple; how about yours?

      I'll use minus sign until perl5-porter optimizes foreach reverse rangeop

      Or i'll use for;;;

        Or i'll use for;;;

        It's a shame you can't use the c-style for as a modifier:

        cmpthese -1, { a=>q[ 1 for -1e6..0; ], b=>q[ for( my $i=1e6; $i; --$i ){ 1 } ] };; Rate b a b 14.0/s -- -26% a 19.0/s 35% --

        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (14)
As of 2014-07-29 13:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (217 votes), past polls