use Benchmark qw(cmpthese);
package Foo;
sub new { bless {slot => "blot"}, shift }
sub getset_orig {
my $self = shift;
if (@_) {
$self->{slot} = shift;
} else {
$self->{slot};
}
}
sub getset_fast {
return $_[0]->{slot} if @_ == 1;
return $_[0]->{slot} = $_[1];
}
# lvalue doesn't play nicely with return :-(
sub getset_lvalue {
if ( @_ == 1 ) {
$_[0]->{slot};
} else {
$_[0]->{slot} = $_[1];
}
}
package main;
my $obj = Foo->new();
cmpthese(-2, {
getset_orig => sub {
$_ = $obj->getset_orig();
$obj->getset_orig($_);
},
getset_fast => sub {
$_ = $obj->getset_fast();
$obj->getset_fast($_);
},
getset_lvalue => sub {
$_ = $obj->getset_lvalue();
$obj->getset_lvalue($_);
},
});