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