#!/usr/bin/perl use strict; use warnings; use File::Find; use Benchmark qw(:all) ; sub sub1 { my %addresses; open my $fh, ') { last if $_ eq "\n"; # only scan headers $_ = lc $_; if (/\b(johnqp\@mailserver\.com)/xms) { my $addr = $1; $addresses{$addr}++; } } close $fh; } sub sub2 { my %addresses; open my $fh, ') { last if $_ eq "\n"; # only scan headers $_ = lc $_; if (/\b(johnqp\@mailserver\.com)/) { my $addr = $1; $addresses{$addr}++; } } close $fh; } sub sub3 { my %addresses; open my $fh, '; if (/^(?:To|Cc):.+(johnqp\@mailserver\.com)/mi) { my $addr = $1; $addresses{$addr}++; } close $fh; } sub sub4 { my %addresses; open my $fh, '; if (/^(?:To|Cc):.+(johnqp\@mailserver\.com)/xsmi) { my $addr = $1; $addresses{$addr}++; } close $fh; } cmpthese(100000, { 'Linewise' => \&sub1, 'Line no /xms' => \&sub2, 'Blockwise' => \&sub3, 'Block /xms' => \&sub4, }); ; __END__ Rate Line no /xms Linewise Block /xms Blockwise Linewise 3256/s 11% -- -22% -24% Line no /xms 2946/s -- -10% -30% -31% Blockwise 4282/s 45% 32% 2% -- Block /xms 4198/s 43% 29% -- -2%