The long:
Rate ikegami2A ikegami1 ikegami3 mrm_l_flex mrm_l ikegami2x ikegami2 orig kvale JavaFan ccn GF mrm_s_flex mrm_s
ikegami2A 105/s -- -76% -77% -77% -78% -80% -80% -92% -92% -93% -93% -94% -94% -94%
ikegami1 436/s 317% -- -4% -5% -10% -16% -17% -67% -69% -69% -70% -74% -75% -76%
ikegami3 457/s 336% 5% -- -1% -5% -12% -13% -66% -67% -68% -69% -72% -74% -75%
mrm_l_flex 461/s 340% 6% 1% -- -4% -11% -13% -65% -67% -67% -69% -72% -73% -74%
mrm_l 482/s 361% 11% 6% 5% -- -7% -9% -64% -65% -66% -67% -71% -72% -73%
ikegami2x 519/s 395% 19% 14% 13% 8% -- -2% -61% -63% -63% -65% -69% -70% -71%
ikegami2 527/s 404% 21% 15% 14% 9% 2% -- -60% -62% -63% -64% -68% -69% -71%
orig 1334/s 1174% 206% 192% 190% 177% 157% 153% -- -4% -5% -10% -20% -23% -26%
kvale 1395/s 1233% 220% 206% 203% 189% 169% 165% 5% -- -1% -6% -16% -19% -22%
JavaFan 1408/s 1246% 223% 208% 206% 192% 172% 167% 6% 1% -- -5% -15% -19% -21%
ccn 1478/s 1312% 239% 224% 221% 206% 185% 180% 11% 6% 5% -- -11% -15% -18%
GF 1658/s 1484% 280% 263% 260% 244% 220% 214% 24% 19% 18% 12% -- -4% -8%
mrm_s_flex 1729/s 1552% 296% 279% 275% 258% 233% 228% 30% 24% 23% 17% 4% -- -4%
mrm_s 1793/s 1613% 311% 293% 289% 272% 246% 240% 34% 29% 27% 21% 8% 4% --
and the short:
Rate ikegami2A ikegami2x ikegami1 ikegami3 ikegami2 mrm_l_flex mrm_l mrm_s_flex kvale JavaFan ccn mrm_s orig GF
ikegami2A 11061/s -- -34% -70% -72% -76% -79% -81% -84% -85% -85% -86% -87% -91% -93%
ikegami2x 16748/s 51% -- -54% -57% -64% -68% -72% -76% -77% -77% -79% -81% -86% -89%
ikegami1 36540/s 230% 118% -- -7% -21% -31% -39% -47% -49% -49% -54% -58% -69% -76%
ikegami3 39098/s 253% 133% 7% -- -16% -26% -34% -44% -45% -46% -51% -55% -67% -75%
ikegami2 46394/s 319% 177% 27% 19% -- -12% -22% -33% -35% -36% -42% -47% -60% -70%
mrm_l_flex 52706/s 376% 215% 44% 35% 14% -- -12% -24% -26% -27% -34% -40% -55% -66%
mrm_l 59650/s 439% 256% 63% 53% 29% 13% -- -14% -17% -17% -25% -32% -49% -61%
mrm_s_flex 69592/s 529% 316% 90% 78% 50% 32% 17% -- -3% -3% -13% -20% -41% -55%
kvale 71680/s 548% 328% 96% 83% 55% 36% 20% 3% -- -0% -10% -18% -39% -54%
JavaFan 71956/s 551% 330% 97% 84% 55% 37% 21% 3% 0% -- -10% -18% -39% -54%
ccn 79989/s 623% 378% 119% 105% 72% 52% 34% 15% 12% 11% -- -8% -32% -48%
mrm_s 87229/s 689% 421% 139% 123% 88% 66% 46% 25% 22% 21% 9% -- -25% -44%
orig 117028/s 958% 599% 220% 199% 152% 122% 96% 68% 63% 63% 46% 34% -- -24%
GF 154844/s 1300% 825% 324% 296% 234% 194% 160% 123% 116% 115% 94% 78% 32% --
####
The long:
Rate ikegami2A ikegami1 ikegami3 ikegami2x ikegami2 mrm_l_flex mrm_l orig JavaFan kvale ccn mrm_s GF mrm_s_flex
ikegami2A 186/s -- -76% -78% -80% -80% -81% -82% -92% -92% -92% -93% -93% -93%
-94%
ikegami1 768/s 312% -- -8% -17% -20% -21% -24% -66% -69% -69% -71% -73% -73%
-73%
ikegami3 839/s 350% 9% -- -9% -12% -14% -18% -63% -66% -66% -68% -71% -71%
-71%
ikegami2x 924/s 396% 20% 10% -- -3% -5% -9% -59% -62% -62% -65% -68% -68%
-68%
ikegami2 955/s 413% 24% 14% 3% -- -2% -6% -57% -61% -61% -63% -67% -67%
-67%
mrm_l_flex 973/s 422% 27% 16% 5% 2% -- -4% -57% -60% -61% -63% -66% -66%
-66%
mrm_l 1017/s 446% 32% 21% 10% 7% 5% -- -55% -58% -59% -61% -65% -65%
-65%
orig 2239/s 1102% 191% 167% 142% 135% 130% 120% -- -8% -9% -14% -22% -22%
-22%
JavaFan 2447/s 1213% 218% 192% 165% 156% 152% 141% 9% -- -1% -6% -15% -15%
-15%
kvale 2463/s 1222% 221% 194% 166% 158% 153% 142% 10% 1% -- -5% -14% -14%
-15%
ccn 2606/s 1299% 239% 211% 182% 173% 168% 156% 16% 7% 6% -- -9% -9%
-10%
mrm_s 2866/s 1438% 273% 242% 210% 200% 195% 182% 28% 17% 16% 10% -- -0%
-1%
GF 2866/s 1438% 273% 242% 210% 200% 195% 182% 28% 17% 16% 10% 0% --
-1%
mrm_s_flex 2881/s 1447% 275% 243% 212% 202% 196% 183% 29% 18% 17% 11% 1% 1%
--
and the short:
Rate ikegami2A ikegami2x ikegami1 ikegami3 ikegami2 mrm_l_flex mrm_s_flex kvale JavaFan mrm_l ccn mrm_s
orig GF
ikegami2A 19874/s -- -25% -68% -69% -75% -81% -82% -83% -83%
-83% -84% -85% -88% -92%
ikegami2x 26499/s 33% -- -57% -59% -66% -75% -77% -77% -77%
-77% -79% -80% -84% -89%
ikegami1 61722/s 211% 133% -- -4% -21% -41% -46% -47% -47%
-47% -52% -53% -63% -75%
ikegami3 64177/s 223% 142% 4% -- -18% -39% -43% -45% -45%
-45% -50% -51% -62% -74%
ikegami2 78054/s 293% 195% 26% 22% -- -26% -31% -33% -33%
-33% -39% -41% -53% -69%
mrm_l_flex 105205/s 429% 297% 70% 64% 35% -- -7% -9% -9%
-10% -17% -20% -37% -58%
mrm_s_flex 113328/s 470% 328% 84% 77% 45% 8% -- -2% -2%
-3% -11% -14% -32% -55%
kvale 115705/s 482% 337% 87% 80% 48% 10% 2% -- -0%
-1% -9% -12% -31% -54%
JavaFan 115788/s 483% 337% 88% 80% 48% 10% 2% 0% --
-1% -9% -12% -31% -54%
mrm_l 117203/s 490% 342% 90% 83% 50% 11% 3% 1% 1%
-- -8% -11% -30% -53%
ccn 127373/s 541% 381% 106% 98% 63% 21% 12% 10% 10%
9% -- -3% -24% -49%
mrm_s 131522/s 562% 396% 113% 105% 69% 25% 16% 14% 14%
12% 3% -- -21% -48%
orig 166825/s 739% 530% 170% 160% 114% 59% 47% 44% 44%
42% 31% 27% -- -34%
GF 251582/s 1166% 849% 308% 292% 222% 139% 122% 117% 117%
115% 98% 91% 51% --
####
use warnings;
use strict;
use Benchmark qw(cmpthese);
my ($ikegamiRe1) = map qr/$_/, join '|', map "(?<=${_}{3})$_+", map quotemeta,
1 .. 9;
my ($ikegamiReA) = map qr/$_/, join '|', map "(?<=${_}{3})$_+", map quotemeta,
(1 .. 9, 'a' .. 'z', 'A' .. 'Z');
my $str = join '', map { $_ x $_ } 1 .. 9;
$str = $str x 20;
print "The long:\n";
cmpthese (
-1,
{
orig => \&orig,
ccn => \&ccn,
kvale => \&kvale,
JavaFan => \&JavaFan,
GF => \&GF,
ikegami1 => \&ikegami1,
ikegami2 => \&ikegami2,
ikegami2A => \&ikegami2A,
ikegami2x => \&ikegami2x,
ikegami3 => \&ikegami3,
mrm_s => \&mrm_s_const,
mrm_l => \&mrm_l_const,
mrm_s_flex => sub { mrm_short( 3, $str ) },
mrm_l_flex => sub { mrm_long( 3, $str ) }
}
);
$str = substr $str, 3, 7;
print "and the short:\n";
cmpthese (
-1,
{
orig => \&orig,
ccn => \&ccn,
kvale => \&kvale,
JavaFan => \&JavaFan,
GF => \&GF,
ikegami1 => \&ikegami1,
ikegami2 => \&ikegami2,
ikegami2A => \&ikegami2A,
ikegami2x => \&ikegami2x,
ikegami3 => \&ikegami3,
mrm_s => \&mrm_s_const,
mrm_l => \&mrm_l_const,
mrm_s_flex => sub { mrm_short( 3, $str ) },
mrm_l_flex => sub { mrm_long( 3, $str ) }
}
);
sub orig {
$_ = $str;
s/(.)(?=\1\1\1)//gs;
}
sub ccn {
$_ = $str;
s/(.)\1{3,}/$1$1$1/gs;
}
sub kvale {
$_ = $str;
s/(.)\1{2,}/$1$1$1/g;
}
sub JavaFan {
$_ = $str;
s/(.)\1{2,}/$1$1$1/g;
}
sub GF {
$_ = $str;
s/((.)\1{2})\1+/$2/g;
}
sub ikegami1 {
$_ = $str;
s/$ikegamiRe1/substr($_,$-[0],3)/eg;
}
sub ikegami2 {
$_ = $str;
s/$ikegamiRe1//g;
}
sub ikegami2A {
$_ = $str;
s/$ikegamiReA//g;
}
sub ikegami2x {
my ($re) = map qr/$_/, join '|', map "(?<=${_}{3})$_+", map quotemeta, 1 .. 9;
$_ = $str;
s/$re//g;
}
sub ikegami3 {
$_ = $str;
s/($ikegamiRe1)/substr($1,0,3)/eg;
}
sub mrm_long {
my $len = length $_[1];
### loop prelude
my $char = substr $_[1], 0, 1;
my $count = 1;
my $new_string = $char;
my $at = 1;
while ( $at < $len ) {
my $old_char = $char;
$char = substr $_[1], $at++, 1;
if ( $char eq $old_char ) {
next if $count >= $_[0];
$count++;
} else {
$count = 1;
}
$new_string .= $char;
}
return $new_string;
}
sub mrm_short {
( my $new_string = $_[1] ) =~ s/(.)\1{$_[0],}/$1 x $_[0]/eg;
return $new_string;
}
sub mrm_s_const {
( my $new_string = $str ) =~ s/(.)\1{3,}/$1 x 3/eg;
return $new_string;
}
sub mrm_l_const {
my $len = length $str;
### loop prelude
my $char = substr $str, 0, 1;
my $count = 1;
my $new_string = $char;
my $at = 1;
while ( $at < $len ) {
my $old_char = $char;
$char = substr $str, $at++, 1;
if ( $char eq $old_char ) {
next if $count >= 3;
$count++;
} else {
$count = 1;
}
$new_string .= $char;
}
return $new_string;
}
####
The long:
Rate ikegami2A mrm_l_flex mrm_l ikegami1 ikegami3 ikegami2x ikegami2 kvale JavaFan ccn orig mrm_s mrm_s_flex GF
ikegami2A 124/s -- -64% -67% -73% -76% -79% -80% -89% -89% -90% -91% -91% -91% -93%
mrm_l_flex 345/s 178% -- -7% -25% -32% -42% -43% -69% -70% -72% -74% -76% -76% -82%
mrm_l 373/s 200% 8% -- -19% -27% -37% -39% -67% -67% -70% -72% -74% -74% -80%
ikegami1 461/s 271% 33% 24% -- -10% -22% -24% -59% -60% -63% -66% -68% -68% -75%
ikegami3 509/s 310% 47% 37% 11% -- -14% -17% -55% -55% -59% -62% -65% -65% -73%
ikegami2x 592/s 377% 71% 59% 28% 16% -- -3% -48% -48% -52% -56% -59% -59% -69%
ikegami2 610/s 392% 77% 64% 32% 20% 3% -- -46% -47% -50% -55% -58% -58% -68%
kvale 1131/s 811% 227% 203% 145% 122% 91% 85% -- -1% -8% -16% -21% -21% -40%
JavaFan 1141/s 820% 230% 206% 148% 124% 93% 87% 1% -- -7% -15% -21% -21% -39%
ccn 1232/s 893% 257% 231% 167% 142% 108% 102% 9% 8% -- -9% -14% -14% -34%
orig 1347/s 986% 290% 261% 192% 165% 128% 121% 19% 18% 9% -- -6% -6% -28%
mrm_s 1436/s 1057% 316% 285% 212% 182% 143% 135% 27% 26% 17% 7% -- -0% -24%
mrm_s_flex 1437/s 1059% 316% 286% 212% 182% 143% 136% 27% 26% 17% 7% 0% -- -24%
GF 1879/s 1415% 444% 404% 308% 269% 218% 208% 66% 65% 53% 40% 31% 31% --
and the short:
Rate ikegami2A ikegami2x ikegami3 mrm_l_flex ikegami1 mrm_l ikegami2 kvale JavaFan mrm_s_flex ccn mrm_s orig GF
ikegami2A 14490/s -- -13% -62% -62% -64% -66% -73% -74% -74% -75% -78% -81% -87% -91%
ikegami2x 16747/s 16% -- -56% -56% -58% -61% -69% -70% -70% -72% -74% -78% -85% -90%
ikegami3 37959/s 162% 127% -- -0% -6% -11% -30% -31% -31% -36% -41% -49% -65% -77%
mrm_l_flex 37959/s 162% 127% 0% -- -6% -11% -30% -31% -31% -36% -41% -49% -65% -77%
ikegami1 40193/s 177% 140% 6% 6% -- -6% -26% -27% -27% -32% -38% -46% -63% -76%
mrm_l 42581/s 194% 154% 12% 12% 6% -- -21% -23% -23% -28% -34% -43% -61% -74%
ikegami2 54097/s 273% 223% 43% 43% 35% 27% -- -2% -2% -8% -17% -27% -50% -67%
kvale 55137/s 281% 229% 45% 45% 37% 29% 2% -- -0% -7% -15% -26% -49% -67%
JavaFan 55137/s 281% 229% 45% 45% 37% 29% 2% -0% -- -7% -15% -26% -49% -67%
mrm_s_flex 59076/s 308% 253% 56% 56% 47% 39% 9% 7% 7% -- -9% -21% -46% -64%
ccn 64869/s 348% 287% 71% 71% 61% 52% 20% 18% 18% 10% -- -13% -40% -61%
mrm_s 74472/s 414% 345% 96% 96% 85% 75% 38% 35% 35% 26% 15% -- -31% -55%
orig 108688/s 650% 549% 186% 186% 170% 155% 101% 97% 97% 84% 68% 46% -- -34%
GF 165414/s 1042% 888% 336% 336% 312% 288% 206% 200% 200% 180% 155% 122% 52% --