use Benchmark qw(:all); my $str = 'iiiiiiiiMMMMMMMMMMMooooooooooooMMMMMMMMMMiiiiiMMMMMMMMoooo'; my $these = { 'count' => sub { my $count = 0; $count++ while $str =~ /(M+)/g; $count; }, 'regex' => sub { my $count = () = $str =~ /(M+)/g; }, 'split' => sub { $#{[split /M+/, $str, -1]}; }, }; printf "%-10s %d\n", $_, $these->{$_}->() for sort keys %$these; print "\n"; cmpthese(-1, $these);