use Benchmark 'cmpthese'; $match=0; $string=""; cmpthese -5, { slower => <<'EOFCODE', for my $i (0..100) { $::string="${i}test"; if($::string =~ /(?:est|\d)/){ $::match++; } } EOFCODE slower2 => <<'EOFCODE', for my $i (0..100) { $::string="${i}test"; if($::string =~ /(?:\d|est)/){ $::match++; } } EOFCODE faster => <<'EOFCODE', for my $i (0..100) { $::string="${i}test"; if ($::string =~ /est/ || $::string =~ /\d/){ $::match++; } } EOFCODE faster2 => <<'EOFCODE', for my $i (0..100) { $::string="${i}test"; if ($::string =~ /\d/ || $::string =~ /est/){ $::match++; } } EOFCODE }; __END__ Benchmark: running faster, faster2, slower, slower2, each for at least 5 CPU seconds... faster: 5 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 3157.84/s (n=16926) faster2: 5 wallclock secs ( 5.39 usr + 0.00 sys = 5.39 CPU) @ 2859.21/s (n=15414) slower: 5 wallclock secs ( 5.44 usr + 0.00 sys = 5.44 CPU) @ 2673.59/s (n=14539) slower2: 6 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 2881.69/s (n=15443) Rate slower faster2 slower2 faster slower 2674/s -- -6% -7% -15% faster2 2859/s 7% -- -1% -9% slower2 2882/s 8% 1% -- -9% faster 3158/s 18% 10% 10% --