sub test_regex {
my @array1 = ( "test", "test2", "test2", "test3", "test4", "test4" );
my @array2 = ( "test", "test", "test2.1", "test4.1", "test4.2", "test4.3" );
# Create a list of the items in array 1 separated by |
# The reverse sort is used to keep the longer names to the front of
# the list, in order to avoid matching 'test' when we could match 'test4'
my $match_array1 = join('|',reverse sort @array1);
# Using the 'x' option with regular expressions helps readability,
# even in simple cases like this
my $regex = qr{
^
($match_array1)
}x;
my %found_one = ();
foreach my $item2 (@array2) {
next unless defined $item2;
if ($item2 =~ /$regex/) {
$found_one{$1}++;
}
}
return keys %found_one;
}
####
use strict;
use warnings;
use Benchmark qw(cmpthese);
if (0) {
print "regex: $_\n" for test_regex();
print "loop: $_\n" for test_loop();
exit;
}
cmpthese(1000,{
loop => \&test_loop,
regex => \&test_regex,
});
sub test_regex {
my @array1 = ( "test", "test2", "test2", "test3", "test4", "test4" );
my @array2 = ( "test", "test", "test2.1", "test4.1", "test4.2", "test4.3" );
# Create a list of the items in array 1 separated by |
# The reverse sort is used to keep the longer names to the front of
# the list, in order to avoid matching 'test' when we could match 'test4'
my $match_array1 = join('|',reverse sort @array1);
# Using the 'x' option with regular expressions helps readability,
# even in simple cases like this
my $regex = qr{
^
($match_array1)
}x;
my %found_one = ();
foreach my $item2 (@array2) {
next unless defined $item2;
if ($item2 =~ /$regex/) {
$found_one{$1}++;
}
}
return keys %found_one;
}
sub test_loop {
my @array1 = ( "test", "test2", "test2", "test3", "test4", "test4" );
my @array2 = ( "test", "test", "test2.1", "test4.1", "test4.2", "test4.3" );
my %found_one = ();
foreach my $item1 (@array1) {
foreach my $item2 (@array2) {
next unless defined $item2;
if (match_names($item1, $item2)) {
$found_one{$item1}++;
last;
}
}
}
return keys %found_one;
}
sub match_names {
my ($x,$y) = @_;
return 1 if ($y =~ /$x/);
return;
}
####
Rate loop regex
loop 1136/s -- -60%
regex 2857/s 151% --