Rate or delete do copy slice map or delete 1620746/s -- -1% -50% -71% -78% do 1642036/s 1% -- -49% -70% -78% copy 3215434/s 98% 96% -- -42% -56% slice 5555556/s 243% 238% 73% -- -24% map 7299270/s 350% 345% 127% 31% -- #### #!/usr/bin/perl use strict; use warnings; use Benchmark qw(cmpthese); # create a hash with a few values deviating my $t_count = 3; my %hosts = map { $_ => $t_count - ( rand 50 > 49 ? 1 : 0 ) } (1 .. 1000); my $count = 10_000_000; cmpthese($count, { ' do' => ' do {delete $hosts{$_} unless $hosts{$_} == $t_count} for keys %hosts ', ' map' => ' map {delete $hosts{$_} unless $hosts{$_} == $t_count} keys %hosts ', 'or delete' => ' $hosts{$_} == $t_count or delete $hosts{$_} for keys %hosts ', ' slice' => ' delete @hosts{ grep { $hosts{$_} != $t_count } keys %hosts } ', ' copy' => ' %hosts = map { $hosts{$_} == $t_count ? ($_, $hosts{$_}) : ()} keys %hosts ', });