#! 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