use strict; use warnings; use Benchmark qw(cmpthese); my $name = 'foo'; my $path = 'foobar'; my $sub1 = sub { $_[0]{$path}{$name} = $_[1] if @_ == 2; $_[0]{$path}{$name} }; my $sub2 = eval qq[ sub { \$_[0]{$path}{$name} = \$_[1] if \@_ == 2; \$_[0]{$path}{$name} } ] or die($@); my $self = {}; cmpthese -1, { closure => sub { $self->$sub1(0); $self->$sub1( $self->$sub1 + $_ ) for 0..10_000; }, stringy => sub { $self->$sub2(0); $self->$sub2( $self->$sub2 + $_ ) for 0..10_000; }, };