use Time::HiRes qw( time ); # ordered insert $insertDurationSum = 0.0; @insertDurationMeas = (); for ($n = 10; $n > 0; $n--) { $start = time(); my %ht = (); for ($i = 10000000; $i > 0; $i--) { $ht{$i} = $i + $n + 0.0; } $end = time(); $duration = $end - $start; $insertDurationSum += $duration; push(@insertDurationMeas, $duration); print "$n\n"; } # find adjustment $start = time(); $x = 0.0; for ($i = 10000000; $i > 0; $i--) { $x = $i + 3.0; } $end = time(); $adjustment = $end - $start; # report on timing $mean = $insertDurationSum/10.0; $durationVar = 0.0; foreach $v (@insertDurationMeas) { $durationVar += ($v-$mean)*($v-$mean); } $stdv = sqrt($durationVar/10.0); printf("insert timing (ordered) in seconds: mean %.2f, adj-mean %.2f, stdv %.2f\n", $mean, $mean - $adjustment, $stdv); # lookup test $start = time(); $lfsr = 1; $x = 0.0; for ($i = 10000000; $i > 0; $i--) { $lfsr = ($lfsr >> 1) ^ (0 - ($lfsr & 1) & 0xd0000001); $x += $ht{$lfsr} } $end = time(); $lookupDuration = $end - $start; # find adjustment $start = time(); $lfsr = 1; $x = 0.0; for ($i = 10000000; $i > 0; $i--) { $lfsr = ($lfsr >> 1) ^ (0 - ($lfsr & 1) & 0xd0000001); $x += $i } $end = time(); $adjustment = $end - $start; printf("lookup timing (mostly misses) in seconds: %.2f, adj %.2f\n", $lookupDuration, $lookupDuration-$adjustment); # unordered insert $insertDurationSum = 0.0; @insertDurationMeas = (); for ($n = 10; $n > 0; $n--) { $start = time(); my %ht = (); $lfsr = 1; for ($i = 10000000; $i > 0; $i--) { $lfsr = ($lfsr >> 1) ^ (0 - ($lfsr & 1) & 0xd0000001); $ht{$lfsr} = $i + $n + 0.0; } $end = time(); $duration = $end - $start; $insertDurationSum += $duration; push(@insertDurationMeas, $duration); print "$n\n"; } # find adjustment $start = time(); $lfsr = 1; $x = 0.0; for ($i = 10000000; $i > 0; $i--) { $lfsr = ($lfsr >> 1) ^ (0 - ($lfsr & 1) & 0xd0000001); $x = $i + 3.0 } $end = time(); $adjustment = $end - $start; # report on timing $mean = $insertDurationSum/10.0; $durationVar = 0.0; foreach $v (@insertDurationMeas) { $durationVar += ($v-$mean)*($v-$mean); } $stdv = sqrt($durationVar/10.0); printf("insert timing (unordered) in seconds: mean %.2f, adj-mean %.2f, stdv %.2f\n", $mean, $mean - $adjustment, $stdv); # lookup test $start = time(); $lfsr = 1; $x = 0.0; for ($i = 10000000; $i > 0; $i--) { $lfsr = ($lfsr >> 1) ^ (0 - ($lfsr & 1) & 0xd0000001); $x += $ht{$lfsr} } $end = time(); $lookupDuration = $end - $start; # find adjustment $start = time(); $lfsr = 1; $x = 0.0; for ($i = 10000000; $i > 0; $i--) { $lfsr = ($lfsr >> 1) ^ (0 - ($lfsr & 1) & 0xd0000001); $x += $i; } $end = time(); $adjustment = $end - $start; printf("lookup timing (no misses) in seconds: %.2f, adj %.2f\n", $lookupDuration, $lookupDuration-$adjustment);