use strict; use warnings; use Benchmark qw( timethese cmpthese ); my $results = timethese( 5000, { orig => sub { delete $P::x{some_key}; for ( 1 .. 1000 ) { $P::x{some_key} ||= ( f(), 1 ); } }, alt_1 => sub { delete $P::x{some_key}; for ( 1 .. 1000 ) { $P::x{some_key} = $P::x{some_key} || ( f(), 1 ); } }, alt_2 => sub { delete $P::x{some_key}; for ( 1 .. 1000 ) { if ( not $P::x{some_key} ) { $P::x{some_key} = 1; f(); } } }, } ); cmpthese($results); sub f() { #No op. }