#! perl -slw use strict; use Time::HiRes qw[ time ]; sub memUsed { my( $mem ) = `tasklist /nh /fi "PID eq $$"` =~ m[([0-9,]+) K]; $mem =~ tr[,][]d; return $mem / 1024; } our $M1 //= 'each'; our $M2 //= 'pairs'; our $N //= 1e6; my %hash; $hash{ sprintf "KEY%010d", $_ } = $_ for 1 .. $N; my $startMem = memUsed; print "hash built, starting timer"; my $start = time; my $count = 0; if( $M1 eq 'each' ) { if( $M2 eq 'pairs' ) { while( my( $k, $v ) = each %hash ) { ++$count; } } else { while( my $k = each %hash ) { ++$count; } } } else { if( $M2 eq 'pairs' ) { for my $k ( keys %hash ) { my $v = $hash{ $k }; ++$count; } } else { for my $k ( keys %hash ) { ++$count; } } } my $endMem = memUsed; printf "Took %.6f and %.3fMB extra memory for $count using $M1/$M2 method\n" , time() - $start, $endMem - $startMem; #### c:\test>each-keys-b -M1=keys -M2=pairs -N=1e6 hash built, starting timer Took 11.663000 and 56.145MB extra memory for 1000000 using keys/pairs method c:\test>each-keys-b -M1=each -M2=pairs -N=1e6 hash built, starting timer Took 1.296000 and 0.020MB extra memory for 1000000 using each/pairs method #### c:\test>each-keys-b -M1=keys -M2=pairs -N=5e6 hash built, starting timer Took 280.350000 and 228.652MB extra memory for 5000000 using keys/pairs method c:\test>each-keys-b -M1=each -M2=pairs -N=5e6 hash built, starting timer Took 6.613000 and 0.020MB extra memory for 5000000 using each/pairs method #### c:\test>each-keys-b -M1=keys -M2=pairs -N=8e6 hash built, starting timer Took 899.040000 and 343.402MB extra memory for 8000000 using keys/pairs method c:\test>each-keys-b -M1=each -M2=pairs -N=8e6 hash built, starting timer Took 11.112000 and 0.023MB extra memory for 8000000 using each/pairs method