Below, benchmarked the same 3 functions with minimal variable declaration.
use warnings;
use strict;
use Benchmark qw{ cmpthese };
# original code by choroba
sub precat {
my ($string, $prefix) = @_;
$string = $prefix . $string;
$string
}
sub Substr {
my ($string, $prefix) = @_;
substr $string, 0, 0, $prefix;
$string
}
sub subst {
my ($string, $prefix) = @_;
$string =~ s/^/$prefix/;
$string
}
# minimal variable declaration
sub precatm {
$_[1] . $_[0];
}
sub Substrm {
substr my $string = $_[0], 0, 0, $_[1];
$string;
}
sub substm {
( my $string = $_[0] ) =~ s/^/$_[1]/;
$string;
}
cmpthese -1, {
precat => q( precat 'def', 'abc' ),
substr => q( Substr 'def', 'abc' ),
subst => q( subst 'def', 'abc' ),
precatm => q( precatm 'def', 'abc' ),
substrm => q( Substrm 'def', 'abc' ),
substm => q( substm 'def', 'abc' ),
};
Results from a 2.6 GHz Core i7 CPU:
Rate subst substm precat substr substrm precatm
subst 2104367/s -- -10% -29% -48% -61% -72%
substm 2338582/s 11% -- -21% -43% -57% -69%
precat 2969268/s 41% 27% -- -27% -45% -61%
substr 4071762/s 93% 74% 37% -- -25% -46%
substrm 5397081/s 156% 131% 82% 33% -- -29%
precatm 7561845/s 259% 223% 155% 86% 40% --