our $str = "x " x 1000; cmpthese -1, { single => sub { local $_ = $::str; s/\s+/ /g; }, multiple => sub { local $_ = $::str; s/\s{2,}/ /g; }, translate => sub { local $_ = $::str; tr/ //s; }, capture1 => sub { local $_ = $::str; s/(\s)+/$1/g; }, capture2 => sub { local $_ = $::str; s/(\s){2,}/$1/g; }, }; __END__ Rate capture1 single capture2 multiple translate capture1 1321/s -- -71% -82% -84% -99% single 4567/s 246% -- -37% -43% -97% capture2 7244/s 448% 59% -- -10% -95% multiple 8071/s 511% 77% 11% -- -95% translate 160627/s 12057% 3417% 2117% 1890% --