<div dir="ltr"><br><div class="gmail_quote">On Sat, Feb 25, 2012 at 10:14 PM, Yossi Itzkovich <span dir="ltr">&lt;<a href="mailto:Yossi.Itzkovich@ecitele.com">Yossi.Itzkovich@ecitele.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Hi<br>
<br>
This solution makes it run slower, isn&#39;t it ?  Since Perl has to use access-by-index, isn&#39;t it ?<br></blockquote><div><br>Not at all.<br><br>If you write it using a C-style for loop, you would still need to access by index:<br>

for ( my $i = 0; $i &lt; @array; $i++ ) {<br>    my $item = $array[$i];<br>}<br>vs.<br>for my $i ( 0 .. $#array ) {<br>    my $item = $array[$i];<br>}<br><br>I actually went and benchmarked it. Using $#array or scalar context @array turned out to be slower. How much slower? Twice as much! If you calculate the array size in advance, it will be *exactly* the same speed. :)<br>

C-style loop uses a cached array size, C-style loop 2 used $#array. (with @array it was pretty much the same)<br><br>Benchmark: timing 100000 iterations of C-style, C-style2, foreach...<br>   C-style:  0 wallclock secs ( 0.47 usr +  0.00 sys =  0.47 CPU) @ 212765.96/s (n=100000)<br>

  C-style2:  1 wallclock secs ( 0.92 usr +  0.00 sys =  0.92 CPU) @ 108695.65/s (n=100000)<br>   foreach:  1 wallclock secs ( 0.47 usr +  0.00 sys =  0.47 CPU) @ 212765.96/s (n=100000)<br><br>Here is a more detailed benchmark. You&#39;ll see here that C-style with pre-calculated array size was a tiny bit faster than the foreach, but I see it as a margin of error in the benchmark because sometimes the foreach is faster.<br>

Benchmark: timing 500000 iterations of C-style $#array, C-style @array, C-style known size, foreach...<br>C-style $#array:  3 wallclock secs ( 4.56 usr +  0.00 sys =  4.56 CPU) @ 109649.12/s (n=500000)<br>C-style @array:  4 wallclock secs ( 3.85 usr +  0.00 sys =  3.85 CPU) @ 129870.13/s (n=500000)<br>

C-style known size:  3 wallclock secs ( 2.28 usr +  0.00 sys =  2.28 CPU) @ 219298.25/s (n=500000)<br>   foreach:  3 wallclock secs ( 2.39 usr +  0.00 sys =  2.39 CPU) @ 209205.02/s (n=500000)<br><br></div></div></div>