in reply to Re: More efficient way to truncate long strings of the same character
in thread More efficient way to truncate long strings of the same character
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% --
|
|---|