use strict; use warnings; use Benchmark 'cmpthese'; my $str = 'FOO' x 14 . 'ZOOCOO' . ('FOO' x 7); for my $subName (qw(doSubZ doSubB doSubX doRegZ doRegB)) { my $result = main->can($subName)->(); $result //= '--undef--'; print "$subName: $result\n"; } cmpthese( -1, { 'substrindexZ' => \&doSubZ, 'substrindexB' => \&doSubB, 'regexpZ' => \&doRegZ, 'regexpB' => \&doRegB, } ); sub doSubZ { return undef if -1 == (my $idx = index ($str, 'ZOO')); return substr ($str, $idx, 6); } sub doSubX { return substr ($str, index ($str, 'BOO'), 6); } sub doSubB { return undef if -1 == (my $idx = index ($str, 'BOO')); return substr ($str, $idx, 6); } sub doRegZ { $str =~ /(ZOO.{3})/; return $1; } sub doRegB { $str =~ /(BOO.{3})/; return $1; } #### doSubZ: ZOOCOO doSubB: --undef-- doSubX: O doRegZ: ZOOCOO doRegB: --undef-- Rate regexpZ substrindexZ substrindexB regexpB regexpZ 1215237/s -- -45% -70% -79% substrindexZ 2198729/s 81% -- -45% -62% substrindexB 4003188/s 229% 82% -- -30% regexpB 5733702/s 372% 161% 43% --