#! /usr/bin/perl use warnings; use strict; my $start = tell DATA; sub orig { seek DATA, $start, 0; my $count = 0; while () { while (/(M+)/g) { $count++; } } return $count } sub ch { my $count = 0; seek DATA, $start, 0; while () { tr/M/M/s; # tr/MIO/MIO/s seems a bit slower for longer inputs. $count += tr/M//; } return $count } use Test::More; is(ch(), orig(), 'ch4'); done_testing(); use Benchmark qw{ cmpthese }; cmpthese(-3, { orig => \&orig, ch => \&ch, }); __DATA__ IIIIIIIIIIIMMMMMMMMMMMMOOOOOOOOOOOOMMMMMMMMMIIIIIIIIIMM IIIIIIMMMMOOOOOMMMMIIIIIIIIIIIIIMMIIII MIM IMI M