#!/usr/bin/perl use warnings; use strict; use Test::More; use Benchmark qw{ cmpthese }; sub orig { my %h = @_; my %r = reverse %h; return $r{ (sort values %h)[0] } } sub Sort { my %h = @_; return (sort { $h{$a} cmp $h{$b} } keys %h)[0] } sub min { my %h = @_; my $min = (keys %h)[0]; $h{$_} lt $h{$min} and $min = $_ for keys %h; return $min } # TEST for my $t ( { a => 'A', b => 'B', c => 'C' }, { abc => 'ABC', def => 'ABC' , xyz => 'XYZ' }, { 1 .. 1_000}, { map int rand 100, 1 .. 1_000 }, ) { my $o = orig(%$t); is Sort(%$t), $o, "onleline-$o"; is min(%$t), $o, "min-$o"; } done_testing(); # BENCHMARK for my $size (10, 100, 1_000, 5E4, 1E6) { my %h = map int rand 100, 1 .. $size; cmpthese(0, { orig => sub { orig(%h) }, sort => sub { Sort(%h) }, min => sub { min(%h) }, }); }