Rate wregex windex_2 windex wregex 212/s -- -24% -32% windex_2 277/s 31% -- -11% windex 310/s 47% 12% -- #### use strict; use warnings; use Benchmark 'cmpthese'; srand( 0 ); my $s = join '', map chr(97+int(rand(26))), 1..100_000; my $n = $s =~ tr/a/a/; print "$n\n"; cmpthese( -1, { windex => \&windex, windex_2 => \&windex_2, wregex => \&wregex, } ); sub windex { my @o; my $o = -1; while ( ( $o = index( $s, 'a', $o+1 )) > -1 ) { push @o, $o } return; } sub windex_2 { my @o; $#o = $n - 1; my $o = -1; my $i = 0; while ( ( $o = index( $s, 'a', $o+1 )) > -1 ) { $o[ $i++ ] = $o } return; } sub wregex { my @o; $s =~ m/a(?{ push @o, pos() - 1 })(?!)/; return; } __END__ 3797 Rate wregex windex_2 windex wregex 212/s -- -24% -32% windex_2 277/s 31% -- -11% windex 310/s 47% 12% --