in reply to Re^3: Creating flexible method accessor (no benchmark?)
in thread Creating flexible method accessor
I chose my words very particularly. The difference is not massive, but it is significant - i.e. it's consistently big enough to be detectable. For a very simple rw accessor closing over a single variable (that is, sub { $_[0]{$name} = $_[1] if @_ == 2; $_[0]{$name} }), it's likely to be about 10%.
For the example which would close over two variables (sub { $_[0]{$path}{$name} = $_[1] if @_ == 2; $_[0]{$path}{$name} }) it's more like 15%.
File and line number info is easy to add to stringy evals.
Moose, Moo, etc create accessors this way not just for fun, but because they're measurably faster.
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; }, };
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: Creating flexible method accessor (noticeable)
by tye (Sage) on Feb 03, 2014 at 00:03 UTC | |
by BrowserUk (Patriarch) on Feb 03, 2014 at 00:20 UTC | |
by tye (Sage) on Feb 03, 2014 at 00:40 UTC |