sub make_accessor
{
my $self = shift;
my ($name, $index) = @_;
no strict 'refs';
*{ref($self) . "::$name"} = sub {
my $self = shift;
return $self->[$index] unless @_;
$self->[$index] = $_[0];
$self;
};
1;
}
####
sub make_accessor
{
my ($index) = $_[2];
no strict 'refs';
*{ref($_[0]) . "::$_[1]"} = sub {
return $_[0]->[$index] unless @_ > 1;
$_[0]->[$index] = $_[1];
$_[0];
};
1;
}
####
use Benchmark qw(cmpthese);
my @array;
make_accessor1(code1, 0);
make_accessor2(code2, 0);
cmpthese(-10, {
lexicals => sub { code1(5) },
no_lexic => sub { code2(5) },
});
sub make_accessor1
{
my ($name, $index) = @_;
*{$name} = sub { $array[$index] = $_[0] };
}
sub make_accessor2
{
my $index = $_[1];
*{$_[0]} = sub { $array[$index] = $_[0] };
}
####
Benchmark: running lexicals, no_lexic, each for at least 5 CPU seconds...
lexicals: 5 wallclock secs ( 5.43 usr + -0.01 sys = 5.42 CPU) @ 700151.48/s (n=3794821)
no_lexic: 7 wallclock secs ( 5.34 usr + 0.00 sys = 5.34 CPU) @ 716661.80/s (n=3826974)
Rate lexicals no_lexic
lexicals 700151/s -- -2%
no_lexic 716662/s 2% --