use strict; use warnings; use Benchmark 'cmpthese'; sub linsearch { my ( $array, $item ) = @_; my $index = 0; $index++ while $index < @$array && $array->[$index] ne $item; return $index < @$array ? $index : -1; } sub fast_linsearch { my ( $array, $item ) = @_; my $index = -1; push @$array, $item; 1 while $array->[ ++$index ] ne $item; pop @$array; return $index < @$array ? $index : -1; } our $array = $array =[ 1 .. 100 ]; cmpthese( -1, { lin_s => 'linsearch($::array,100)', fast_s => 'fast_linsearch($::array,100)', } ); __END__ Benchmark: running fast_s, lin_s, each for at least 1 CPU seconds... fast_s: 1 wallclock secs ( 1.01 usr + 0.00 sys = 1.01 CPU) @ 11182.81/s (n=11317) lin_s: 1 wallclock secs ( 1.03 usr + 0.00 sys = 1.03 CPU) @ 5761.40/s (n=5940) Rate lin_s fast_s lin_s 5761/s -- -48% fast_s 11183/s 94% --