use warnings; use strict; use Benchmark qw(cmpthese); my $multiplier = 10_000; my $s__ = "abcdefghij" x $multiplier; # base string my $s10 = "Abcdefghij" x $multiplier; # 10% differ my $s50 = "ABCDEfghij" x $multiplier; # 50% differ my $s90 = "ABCDEFGHIj" x $multiplier; # 90% differ sub differ_at_rx { my $diff = $_[0] ^ $_[1]; my @diffs; push @diffs, $-[1] while $diff =~ m{ ([^\000]) }xmsg; return \@diffs; } sub differ_at_up { my @diffs = unpack 'C*', $_[0] ^ $_[1]; return [ grep $diffs[$_], 0 .. $#diffs ]; } print "multiplier == $multiplier \n"; cmpthese(-10, { up_10 => sub { differ_at_up($s__, $s10) }, up_50 => sub { differ_at_up($s__, $s50) }, up_90 => sub { differ_at_up($s__, $s90) }, rx_10 => sub { differ_at_rx($s__, $s10) }, rx_50 => sub { differ_at_rx($s__, $s50) }, rx_90 => sub { differ_at_rx($s__, $s90) }, }); #### C:\@Work\Perl\monks\745091>perl 745091_1.pl multiplier == 1000 Rate rx_90 rx_50 up_90 up_50 up_10 rx_10 rx_90 20.9/s -- -46% -71% -72% -77% -89% rx_50 38.4/s 84% -- -46% -49% -58% -79% up_90 71.0/s 239% 85% -- -6% -22% -61% up_50 75.5/s 261% 97% 6% -- -17% -59% up_10 90.7/s 333% 136% 28% 20% -- -50% rx_10 183/s 774% 376% 158% 142% 102% -- C:\@Work\Perl\monks\745091>perl 745091_1.pl multiplier == 10000 Rate rx_90 rx_50 up_90 up_50 up_10 rx_10 rx_90 2.05/s -- -47% -65% -69% -70% -88% rx_50 3.83/s 87% -- -34% -42% -43% -77% up_90 5.81/s 184% 52% -- -12% -14% -65% up_50 6.57/s 221% 72% 13% -- -3% -60% up_10 6.76/s 230% 76% 16% 3% -- -59% rx_10 16.5/s 709% 332% 185% 152% 145% --