sub compare {
state $stripped;
($stripped->{$_[0]} //= $_[0] =~ s/<(?:i|ph|bpt|ept) [^>]*?>//gr)
eq
($stripped->{$_[1]} //= $_[1] =~ s/<(?:i|ph|bpt|ept) [^>]*?>//gr);
}
####
!/usr/bin/env perl
use 5.014;
use warnings;
use Benchmark 'cmpthese';
my @data = (
'XX', 'XY', 'XX', 'XY',
'XX', 'XY',
'XX', 'XY',
'XX', 'XY',
'XXXXXX',
'XXXXXY',
);
if (@ARGV && $ARGV[0] eq 'bench') {
cmpthese 0 => {
orig => sub { run_comp(\&compare, 1) },
kens => sub { run_comp(\&kens_cmp, 1) },
};
}
else {
say '*** Original ***';
say '-' x 60;
sub { run_comp(\&compare) }->();
say '*** Ken\'s ***';
say '-' x 60;
sub { run_comp(\&kens_cmp) }->();
}
sub run_comp {
my ($cmp_func, $bench) = @_;
for my $d1 (@data) {
for my $d2 (@data) {
if (defined $bench) {
$cmp_func->($d1, $d2);
}
else {
say "'$d1' and '$d2': ",
$cmp_func->($d1, $d2) ? "SAME" : "DIFFER";
}
}
}
}
sub compare {
# We ignore the standalone, opening and closing tags , , ,
my $cString1 = $_[0];
my $cString2 = $_[1];
$cString1 =~ s/\/?<(bpt|ept|ph|i)[^<>]*>//gsmi;
$cString2 =~ s/\/?<(bpt|ept|ph|i)[^<>]*>//gsmi;
("$cString1" eq "$cString2") ? return 1 : return 0;
}
sub kens_cmp {
state $stripped;
($stripped->{$_[0]} //= $_[0] =~ s/<(?:i|ph|bpt|ept) [^>]*?>//gr)
eq
($stripped->{$_[1]} //= $_[1] =~ s/<(?:i|ph|bpt|ept) [^>]*?>//gr);
}
####
$ ./pm_1217567_cmp_bench.pl bench
Rate orig kens
orig 2035/s -- -81%
kens 10576/s 420% --
####
$ ./pm_1217567_cmp_bench.pl > ./pm_1217567_cmp_bench_both.out
$ cp ./pm_1217567_cmp_bench_both.out ./pm_1217567_cmp_bench_orig.out
$ cp ./pm_1217567_cmp_bench_both.out ./pm_1217567_cmp_bench_kens.out
$ vi ./pm_1217567_cmp_bench_orig.out # /KendGZZ
$ vi ./pm_1217567_cmp_bench_kens.out # /Kenkmm1Gd'mZZ
$ diff ./pm_1217567_cmp_bench_orig.out ./pm_1217567_cmp_bench_kens.out
1c1
< *** Original ***
---
> *** Ken's ***
$