use strict; use warnings; use feature qw( state ); use Benchmark qw( cmpthese ); use List::Util qw( first shuffle ); use List::MoreUtils qw( firstidx indexes ); my @array = shuffle (1 .. 1e6); cmpthese ( 10, { grep => sub { _grep() }, first => sub { _first() }, indexes => sub { _indexes() }, firstidx => sub { _firstidx() }, } ); sub _grep { state $init = 1; my ($i1) = grep { $array[$_] == 1 } 0 .. $#array; my ($i2) = grep { $array[$_] == 2 } 0 .. $#array; my ($i3) = grep { $array[$_] == 3 } 0 .. $#array; if ($init) { printf "<%d> <%d> <%d>\n", $i1, $i2, $i3; $init = 0; } } sub _first { state $init = 1; my $i1 = first { $array[$_] == 1 } (0 .. $#array); my $i2 = first { $array[$_] == 2 } (0 .. $#array); my $i3 = first { $array[$_] == 3 } (0 .. $#array); if ($init) { printf "<%d> <%d> <%d>\n", $i1, $i2, $i3; $init = 0; } } sub _indexes { state $init = 1; my $i1 = indexes { $array[$_] == 1 } (0 .. $#array); my $i2 = indexes { $array[$_] == 2 } (0 .. $#array); my $i3 = indexes { $array[$_] == 3 } (0 .. $#array); if ($init) { printf "<%d> <%d> <%d>\n", $i1, $i2, $i3; $init = 0; } } sub _firstidx { state $init = 1; my $i1 = firstidx { $_ == 1 } @array; my $i2 = firstidx { $_ == 2 } @array; my $i3 = firstidx { $_ == 3 } @array; if ($init) { printf "<%d> <%d> <%d>\n", $i1, $i2, $i3; $init = 0; } }