Thanks for your help!
I am sorry I missed something important in the code snippet.
for($i = 0; $i < @lines; $i++)
{
$sum = 0;
$sum += $lines[$_]->{foo_value} for ($i - $n + 1 .. $i);
push @res, $sum;
}
this is what I intend.I try to make it clear and removed something so that
change the original intend without noticing it, sorry.
I write a little program:
#!/usr/bin/perl
use warnings;
use List::Util qw(sum);
push @lines, {foo_value => 6000 + int rand(4000)} for 0 .. 60000;
my $n = 100;
for my $i (99 .. 60000)
{
my ($sum1, $sum2, $sum3);
$sum1 += $lines[$_]->{foo_value} for ($i - $n + 1 .. $i);
map {$sum2 += $_->{foo_value}} @lines[$i - $n + 1 .. $i];
$sum3 = sum (map {$_->{foo_value}} @lines[$i - $n + 1 .. $i]);
}
and profile it, it turns out the result
3.00s $sum1 += $lines[$_]->{foo_value} for ($i - $n + 1 .. $i);
1.71s map {$sum2 += $_->{foo_value}} @lines[$i - $n + 1 .. $i];
2.10s $sum3 = sum (map {$_->{foo_value}} @lines[$i - $n + 1 .. $i]);
using map on sliced list makes it better but still not acceptable.Any more
ideas?
and I used to think the "foreach $i (0..$#lines)" and "for($i = 0; $i <
@lines; $i++)" are the same.
but the prior cost 66µs , a great victory compared to the second's 50ms.
how should I suppose to know they have efficiency differences? *:-)*
Thanks for your help again!