Thank you for this. I've done this benchmark:
use strict;
use Benchmark qw(:all);
my $weapons_ref = {
dagger => { cost => 8, damage => 4, armor => 0 },
shortsword => { cost => 10, damage => 5, armor => 0 },
warhammer => { cost => 25, damage => 6, armor => 0 },
longsword => { cost => 40, damage => 7, armor => 0 },
greataxe => { cost => 74, damage => 8, armor => 0 },
};
my @sum_fields = qw/cost damage armor/;
my $count;
cmpthese($count, {
'MapSub' => sub {
my $sum_result;
map {
my $name = $_;
map { $sum_result->{$_} += $weapons_ref->{$name}->{$_} } @sum_
+fields
} keys %{ $weapons_ref };
},
'ForSub' => sub {
my $sum_result;
foreach my $name (keys %{ $weapons_ref }) {
foreach my $field (@sum_fields) {
$sum_result->{$field} += $weapons_ref->{$name}->{$field};
}
}
},
});
And here's result:
Rate MapSub ForSub
MapSub 197098/s -- -33%
ForSub 294627/s 49% --
map is a bit slower, yes, but not critical. Anyway, thank you again, I will remember this if have to do code optimization.