use Benchmark 'cmpthese'; my %hash = ( 1 .. 666 ); cmpthese( -3, { 'for' => sub { for my $i ( keys %hash ) { my $c = $hash{$i}; } return(); }, 'while' => sub { while( my( $k, $v ) = each %hash ){ my $c = $v; # yeah; } return(); }, }); __END__ Benchmark: running for, while, each for at least 3 CPU seconds... for: 3 wallclock secs ( 3.27 usr + 0.00 sys = 3.27 CPU) @ 3560.93/s (n=11630) while: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 2640.96/s (n=8253) Rate while for while 2641/s -- -26% for 3561/s 35% -- Benchmark: running for, while, each for at least 3 CPU seconds... for: 4 wallclock secs ( 3.30 usr + 0.00 sys = 3.30 CPU) @ 3527.45/s (n=11630) while: 3 wallclock secs ( 3.37 usr + 0.00 sys = 3.37 CPU) @ 2452.74/s (n=8278) Rate while for while 2453/s -- -30% for 3527/s 44% --