use Benchmark qw/cmpthese timethese :hireswallclock/; my $N = 1e6; # N my @allrefs = map { 1e5 + int rand 9e5 } 1..$N; my %uni_refs = map { 1e6 + int rand 9e6 => $_ } 1..$N; cmpthese(timethese(-10, { op => \&op, op_nosort => \&op_nosort, ikegami => \&ikegami, ikegami_sort => \&ikegami, })); sub op { my @refs = @allrefs[ sort { $a <=> $b } values %uni_refs ] } sub op_nosort { my @refs = @allrefs[ values %uni_refs ] } sub ikegami { my %keep = map { $_ => 1 } values %uni_refs; my @refs = @allrefs[ grep $keep{$_}, 0..$#allrefs ]; } sub ikegami_sort { my %keep = map { $_ => 1 } values %uni_refs; my @refs = @allrefs[ sort { $a <=> $b } grep $keep{$_}, 0..$#allrefs ]; }