use strict;
use warnings;
use Benchmark qw(cmpthese);
my $short = q( a b c );
my $long = join('x', map {' ' x (int(rand(20))+1)} 1 .. 100);
my %func = (
triple_s => <<'EOFUNC',
sub {
my $str = $_;
$str =~ s/^\s*//;
$str =~ s/\s*$//;
$str =~ s/\s+/ /g;
$str;
}
EOFUNC
double_s => <<'EOFUNC',
sub {
my $str = $_;
$str =~ s/^\s*|\s*$//;
$str =~ s/\s+/ /g;
$str;
}
EOFUNC
join_split => <<'EOFUNC',
sub {
my $str = $_;
join ' ', split ' ', $str;
}
EOFUNC
);
sub make {
my ($str, $f) = @_;
($f = $func{$f}) =~ s/_/$str/;
eval $f;
}
print "\nShort string:\n";
cmpthese(-1, {
'triple-s' => make(qw(short triple_s)),
'double-s' => make(qw(short double_s)),
'join-split' => make(qw(short join_split)),
});
print "\nLong string:\n";
cmpthese(-1, {
'triple-s' => make(qw(long triple_s)),
'double-s' => make(qw(long double_s)),
'join-split' => make(qw(long join_split)),
});
####
Short string:
Rate triple-s join-split double-s
triple-s 305867/s -- -31% -37%
join-split 441107/s 44% -- -9%
double-s 482473/s 58% 9% --
Long string:
Rate triple-s join-split double-s
triple-s 4775/s -- -69% -86%
join-split 15251/s 219% -- -55%
double-s 33822/s 608% 122% --
####
use strict;
use warnings;
use Benchmark qw(cmpthese);
my $short = q( a b c );
my $long = join('x', map {' ' x (int(rand(20))+1)} 1 .. 100);
my %func = (
triple_s => <<'EOFUNC',
sub {
my $str = $_;
$str =~ s/^\s*//;
$str =~ s/\s*$//;
$str =~ s/\s+/ /g;
$str;
}
EOFUNC
triple_sp => <<'EOFUNC',
sub {
my $str = $_;
$str =~ s/^\s+//;
$str =~ s/\s+$//;
$str =~ s/\s+/ /g;
$str;
}
EOFUNC
triple_sp_r => <<'EOFUNC',
sub {
my $str = $_;
$str =~ s/\s+/ /g;
$str =~ s/^\s+//;
$str =~ s/\s+$//;
$str;
}
EOFUNC
double_s => <<'EOFUNC',
sub {
my $str = $_;
$str =~ s/^\s*|\s*$//g;
$str =~ s/\s+/ /g;
$str;
}
EOFUNC
double_sp => <<'EOFUNC',
sub {
my $str = $_;
$str =~ s/^\s+|\s+$//g;
$str =~ s/\s+/ /g;
$str;
}
EOFUNC
double_sp_r => <<'EOFUNC',
sub {
my $str = $_;
$str =~ s/\s+/ /g;
$str =~ s/^\s+|\s+$//g;
$str;
}
EOFUNC
join_split => <<'EOFUNC',
sub {
my $str = $_;
join ' ', split ' ', $str;
}
EOFUNC
);
sub make {
my ($str, $f) = @_;
($f = $func{$f}) =~ s/_/$str/;
eval $f;
}
print "\nShort string:\n";
cmpthese(-5, {
'3-s' => make(qw(short triple_s)),
'2-s' => make(qw(short double_s)),
'3-sp' => make(qw(short triple_sp)),
'2-sp' => make(qw(short double_sp)),
'3-sp_r' => make(qw(short triple_sp_r)),
'2-sp_r' => make(qw(short double_sp_r)),
'j-split' => make(qw(short join_split)),
});
print "\nLong string:\n";
cmpthese(-5, {
'3-s' => make(qw(long triple_s)),
'2-s' => make(qw(long double_s)),
'3-sp' => make(qw(long triple_sp)),
'2-sp' => make(qw(long double_sp)),
'3-sp_r' => make(qw(long triple_sp_r)),
'2-sp_r' => make(qw(long double_sp_r)),
'j-split' => make(qw(long join_split)),
});
####
Short string:
Rate 2-s 2-sp 2-sp_r 3-s 3-sp_r 3-sp j-split
2-s 114468/s -- -14% -26% -28% -42% -47% -47%
2-sp 132675/s 16% -- -14% -17% -33% -38% -38%
2-sp_r 155014/s 35% 17% -- -3% -21% -28% -28%
3-s 159352/s 39% 20% 3% -- -19% -26% -26%
3-sp_r 196609/s 72% 48% 27% 23% -- -8% -9%
3-sp 214344/s 87% 62% 38% 35% 9% -- -0%
j-split 214880/s 88% 62% 39% 35% 9% 0% --
Long string:
Rate 2-s 2-sp 3-s j-split 2-sp_r 3-sp 3-sp_r
2-s 1961/s -- -3% -37% -76% -77% -83% -85%
2-sp 2029/s 3% -- -34% -76% -76% -83% -85%
3-s 3092/s 58% 52% -- -63% -63% -74% -77%
j-split 8343/s 325% 311% 170% -- -1% -29% -38%
2-sp_r 8443/s 331% 316% 173% 1% -- -28% -38%
3-sp 11694/s 496% 476% 278% 40% 39% -- -13%
3-sp_r 13512/s 589% 566% 337% 62% 60% 16% --