#! /usr/local/bin/perl -w
use strict;
use Benchmark qw/cmpthese/;
my %h;
$h{ int(rand 1_000_000) } = rand 1000 for 1..10_000;
sub min_by_sort { ( sort {$a <=> $b} keys %h )[0] }
sub min_by_scan {
my $min = undef;
(not defined $min or $min > $_) and $min = $_ for keys %h;
$min;
}
print "min_by_sort = ", min_by_sort(), "\n";
print "min_by_scan = ", min_by_scan(), "\n";
cmpthese(
shift || -5,
{
min_by_sort => \&min_by_sort,
min_by_scan => \&min_by_scan,
}
)
####
min_by_sort = 107
min_by_scan = 107
Benchmark: running min_by_scan, min_by_sort, each for at least 5 CPU seconds...
min_by_scan: 4 wallclock secs ( 5.44 usr + 0.00 sys = 5.44 CPU) @ 95284.97/s (n=518112)
min_by_sort: 6 wallclock secs ( 5.12 usr + 0.00 sys = 5.12 CPU) @ 152355.18/s (n=779630)
Rate min_by_scan min_by_sort
min_by_scan 95285/s -- -37%
min_by_sort 152355/s 60% --
####
min_by_scan: 6 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 93681.46/s (n=496219)
min_by_sort: 6 wallclock secs ( 5.28 usr + 0.00 sys = 5.28 CPU) @ 71843.03/s (n=379421)
Rate min_by_sort min_by_scan
min_by_sort 71843/s -- -23%
min_by_scan 93681/s 30% --
####
min_by_sort = 301
min_by_scan = 301
Benchmark: running min_by_scan, min_by_sort, each for at least 5 CPU seconds...
min_by_scan: 6 wallclock secs ( 5.48 usr + 0.01 sys = 5.48 CPU) @ 94.63/s (n=519)
min_by_sort: 6 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 73.14/s (n=388)
Rate min_by_sort min_by_scan
min_by_sort 73.1/s -- -23%
min_by_scan 94.6/s 29% --