#!/usr/bin/perl use Benchmark 'cmpthese'; use warnings; @array = ( 'a'..'zz' ); $value = 'mz'; my $res; my $position; print "for(): ".traditional(). "\tforeach: ".for_each(). "\tmap: ".maptohash(). "\tgrep_if: ".grep_if(). "\tbinary search: ".bin_search(). "\n"; cmpthese ( 1000, { for_loop => '$res = traditional()', map => '$res = maptohash()', for_each => '$res = for_each()', grep_if => '$res = grep_if()', bin_search => '$res = bin_search()', } ); sub traditional{ for ($position=0; $position <= $#array; $position++) { last if ($array[$position] eq $value); } return $position; } sub for_each{ for our $position ( 0..$#array ) { last if ($array[$position] eq $value) ; } return $position; } sub maptohash{ %indexed = map{ $array[$_], $_ } (0..$#array); return $indexed{$value}; } sub grep_if{ my @res = grep {$array[$_] eq $value} (0..$#array); return @res[0]; } sub bin_search { return BinSearch( $value, \&cmpFunc, \@array ); } sub BinSearch { my ($target, $cmp) = @_; my @array = @{$_[2]}; my $posmin = 0; my $posmax = $#array; return -0.5 if &$cmp (0, \@array, $target) > 0; return $#array + 0.5 if &$cmp ($#array, \@array, $target) < 0; while (1) { my $mid = int (($posmin + $posmax) / 2); my $result = &$cmp ($mid, \@array, $target); if ($result < 0) { $posmin = $posmax, next if $mid == $posmin && $posmax != $posmin; return $mid + 0.5 if $mid == $posmin; $posmin = $mid; } elsif ($result > 0) { $posmax = $posmin, next if $mid == $posmax && $posmax != $posmin; return $mid - 0.5 if $mid == $posmax; $posmax = $mid; } else { return $mid; } } } sub cmpFunc { my ($index, $arrayRef, $target) = @_; my $item = $$arrayRef[$index]; return $item cmp $target; } %perl foo.pl [10:49pm] Scalar value @res[0] better written as $res[0] at foo.pl line 47. for(): 363 foreach: 363 map: 363 grep_if: 363 binary search: 363 Rate map for_loop grep_if bin_search for_each map 200/s -- -69% -72% -81% -88% for_loop 650/s 224% -- -8% -39% -60% grep_if 707/s 253% 9% -- -33% -57% bin_search 1058/s 428% 63% 50% -- -36% for_each 1641/s 719% 153% 132% 55% --