use Benchmark qw(cmpthese); my $str = "wwibblewibblewibblewibbleibblewibblewibblewibble"; cmpthese -1, { regex => sub { my %count; ++$count{$_} for $str =~ /(?=(..))/g; }, substr => sub { my %count; ++$count{substr $str, $_, 2} for (0 .. length($str) - 2); }, unpack => sub { my %count; my $n = length($str) - 1; ++$count{$_} for unpack qq{(a2 X)$n}, $str; }, }; Rate regex unpack substr regex 15316/s -- -43% -74% unpack 26935/s 76% -- -54% substr 58514/s 282% 117% --