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% --