Not a fair comparison. You're creating an entirely new SV every time, whereas the OP was using an existing ref.
$Contracts{$key}[STATE]
vs
my $r = $Contracts{$key};
$r->[STATE]
is not similar to
$Contracts{$key}
vs
my $r = \$Contracts{$key};
$$r
Update:
My benchmark:
use strict;
use warnings;
use Benchmark qw( cmpthese );
use constant NUM_KEYS => $ARGV[0];
use constant NUM_ACCESSES => $ARGV[1];
use constant TEST_TIME => $ARGV[2];
our %contracts = map { $_ => [ 0 ] } 1 .. NUM_KEYS;
my $lookup = '
foreach (keys %contracts) {
_____
}
';
$lookup =~ s/_____/'$a = $contracts{$_}[0];' x NUM_ACCESSES/e;
my $refit = '
foreach (keys %contracts) {
my $r = $contracts{$_};
_____
}
';
$refit =~ s/_____/'$a = $r->[0];' x NUM_ACCESSES/e;
cmpthese(TEST_TIME, {
lookup => $lookup,
refit => $refit,
});
My results:
>perl 586841.pl 500 4 -5
Rate lookup refit
lookup 1060/s -- -4%
refit 1101/s 4% --
>perl 586841.pl 500 4 -5
Rate lookup refit
lookup 1053/s -- -5%
refit 1105/s 5% --
>perl 586841.pl 500 6 -5
Rate lookup refit
lookup 772/s -- -11%
refit 869/s 13% --
>perl 586841.pl 500 6 -5
Rate lookup refit
lookup 775/s -- -11%
refit 873/s 13% --
>perl 586841.pl 500 10 -5
Rate lookup refit
lookup 496/s -- -19%
refit 614/s 24% --
>perl 586841.pl 500 10 -5
Rate lookup refit
lookup 499/s -- -19%
refit 613/s 23% --
Verdict: It's a fruitful optimization, but it's not ground breaking.