results (5.10.0, Linux Mandriva 2008, Athlon 1Ghz, 512MB RAM):
The long: Rate ikegami2A ikegami1 ikegami3 mrm_l_flex mrm_l ikegami +2x ikegami2 orig kvale JavaFan ccn GF mrm_s_flex mrm_s ikegami2A 105/s -- -76% -77% -77% -78% -8 +0% -80% -92% -92% -93% -93% -94% -94% -94% ikegami1 436/s 317% -- -4% -5% -10% -1 +6% -17% -67% -69% -69% -70% -74% -75% -76% ikegami3 457/s 336% 5% -- -1% -5% -1 +2% -13% -66% -67% -68% -69% -72% -74% -75% mrm_l_flex 461/s 340% 6% 1% -- -4% -1 +1% -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% 15 +7% 153% -- -4% -5% -10% -20% -23% -26% kvale 1395/s 1233% 220% 206% 203% 189% 16 +9% 165% 5% -- -1% -6% -16% -19% -22% JavaFan 1408/s 1246% 223% 208% 206% 192% 17 +2% 167% 6% 1% -- -5% -15% -19% -21% ccn 1478/s 1312% 239% 224% 221% 206% 18 +5% 180% 11% 6% 5% -- -11% -15% -18% GF 1658/s 1484% 280% 263% 260% 244% 22 +0% 214% 24% 19% 18% 12% -- -4% -8% mrm_s_flex 1729/s 1552% 296% 279% 275% 258% 23 +3% 228% 30% 24% 23% 17% 4% -- -4% mrm_s 1793/s 1613% 311% 293% 289% 272% 24 +6% 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% --
more results (Strawberry Perl 5.10.0 on Windows XP, Athlon XP 2400+, 1 GB RAM):
The long: Rate ikegami2A ikegami1 ikegami3 ikegami2x ikegami2 mrm_l_flex mrm_l o +rig 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_f +lex 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% --
and the code:
use warnings; use strict; use Benchmark qw(cmpthese); my ($ikegamiRe1) = map qr/$_/, join '|', map "(?<=${_}{3})$_+", map qu +otemeta, 1 .. 9; my ($ikegamiReA) = map qr/$_/, join '|', map "(?<=${_}{3})$_+", map qu +otemeta, (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 quotem +eta, 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 ikegami +2x ikegami2 kvale JavaFan ccn orig mrm_s mrm_s_flex GF ikegami2A 124/s -- -64% -67% -73% -76% -7 +9% -80% -89% -89% -90% -91% -91% -91% -93% mrm_l_flex 345/s 178% -- -7% -25% -32% -4 +2% -43% -69% -70% -72% -74% -76% -76% -82% mrm_l 373/s 200% 8% -- -19% -27% -3 +7% -39% -67% -67% -70% -72% -74% -74% -80% ikegami1 461/s 271% 33% 24% -- -10% -2 +2% -24% -59% -60% -63% -66% -68% -68% -75% ikegami3 509/s 310% 47% 37% 11% -- -1 +4% -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% 9 +1% 85% -- -1% -8% -16% -21% -21% -40% JavaFan 1141/s 820% 230% 206% 148% 124% 9 +3% 87% 1% -- -7% -15% -21% -21% -39% ccn 1232/s 893% 257% 231% 167% 142% 10 +8% 102% 9% 8% -- -9% -14% -14% -34% orig 1347/s 986% 290% 261% 192% 165% 12 +8% 121% 19% 18% 9% -- -6% -6% -28% mrm_s 1436/s 1057% 316% 285% 212% 182% 14 +3% 135% 27% 26% 17% 7% -- -0% -24% mrm_s_flex 1437/s 1059% 316% 286% 212% 182% 14 +3% 136% 27% 26% 17% 7% 0% -- -24% GF 1879/s 1415% 444% 404% 308% 269% 21 +8% 208% 66% 65% 53% 40% 31% 31% -- and the short: Rate ikegami2A ikegami2x ikegami3 mrm_l_flex ikegami1 m +rm_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% --
In reply to Re^2: More efficient way to truncate long strings of the same character
by mr_mischief
in thread More efficient way to truncate long strings of the same character
by kurtis
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |