Interestingly, if you throw a literal value in the mix, as done below, you will find that the literal is even usually a hair slower than a my variable. I'd be very curious to know why that is:
#!/usr/bin/perl -w
use strict;
use vars qw(*const_alias $const_local);
use Benchmark qw(cmpthese);
local *const_alias = \100;
my $const_ref = \100;
local $const_local = 100;
my $const_my = 100;
sub CONST_SUB () { 100 };
use constant CONST_MOD => 100;
print "mod[".CONST_MOD."]\nsub[".CONST_SUB."]\n"
."my[$const_my]\nlocal[$const_local]\n"
."ref[$$const_ref]\nalias[$const_alias]\n";
# run iteratively within the sub to get a less skewed
# result - that's my theory anyway :-)
my $iter = 500;
my $t;
cmpthese (-5,
{
CMod => sub { $t = CONST_MOD for 1..$iter },
CSub => sub { $t = CONST_SUB for 1..$iter },
CMy => sub { $t = $const_my for 1..$iter },
CLocal => sub { $t = $const_local for 1..$iter },
CRef => sub { $t = $$const_ref for 1..$iter },
CAlias => sub { $t = $const_alias for 1..$iter },
CLit => sub { $t = 100 for 1..$iter },
});
### RESULTS (repeatable this time :) ###
Rate CRef CAlias CLocal CSub CLit CMod CMy
CRef 3735/s -- -9% -9% -10% -11% -11% -13%
CAlias 4088/s 9% -- -0% -2% -3% -3% -5%
CLocal 4088/s 9% 0% -- -2% -3% -3% -5%
CSub 4172/s 12% 2% 2% -- -1% -1% -3%
CLit 4208/s 13% 3% 3% 1% -- -0% -2%
CMod 4210/s 13% 3% 3% 1% 0% -- -2%
CMy 4293/s 15% 5% 5% 3% 2% 2% --
MeowChow
s aamecha.s a..a\u$&owag.print |