purple:/tmp oneiros$ perl -version | head -2 This is perl, v5.8.6 built for darwin-thread-multi-2level purple:/tmp oneiros$ perl timer.pl 100: Rate map new_map void_map for foreach map 1089/s -- -16% -37% -61% -61% new_map 1295/s 19% -- -25% -54% -54% void_map 1718/s 58% 33% -- -38% -39% for 2793/s 156% 116% 63% -- -1% foreach 2825/s 159% 118% 64% 1% -- 500: Rate map new_map void_map foreach for map 213/s -- -14% -35% -60% -60% new_map 249/s 17% -- -24% -53% -54% void_map 328/s 54% 32% -- -38% -39% foreach 526/s 147% 112% 61% -- -2% for 538/s 153% 116% 64% 2% -- 2500: Rate map new_map void_map for foreach map 38.5/s -- -15% -38% -61% -61% new_map 45.4/s 18% -- -27% -54% -55% void_map 61.9/s 61% 37% -- -38% -38% for 99.5/s 158% 119% 61% -- -0% foreach 100.0/s 160% 120% 61% 0% -- #### use warnings; use strict; use Benchmark qw(cmpthese); my @counts = qw( 100 500 2500 ); my %templates = ( map => '@list = map { s/1//; $_ } @list;', new_map => 'my @newlist = map { s/1//; $_ } @list;', void_map => 'map { s/1// } @list;', foreach => 's/1// foreach @list;', for => 's/1// for @list;' ); my @tests = (); while ( my ($name, $template) = each (%templates)) { my $test = <{$name} = sub { &$test( 1 .. $count ) }; } } foreach my $count (@counts) { print "\n$count:\n"; cmpthese( 500_000/$count, $tests[$count] ); }