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) }, });