http://www.perlmonks.org?node_id=309635


in reply to Make your classes use their own methods

There is only one reason to not use your own accessor methods, and that's to microoptimize your code for speed.
Just to see the speed difference between direct vs. method access, I did a little benchmark. If speed is important and you are using accessors repeatedly in a tight loop, there certainly is merit to direct access.
use strict; use Benchmark "cmpthese"; my $foo = new foo; cmpthese(-5,{ direct=>sub{ $foo->{bar} }, accessor=>sub{ $foo->bar; } } ); package foo; sub new { my $class = shift; my $self = { bar=>"I am a bar" }; bless $self,$class; } sub bar{ my $self = shift; if (@_) { return $self->{bar} = shift; } return $self->{bar}; } __OUTPUT__ Benchmark: running accessor, direct, each for at least 5 CPU seconds.. +. accessor: 6 wallclock secs ( 5.08 usr + 0.01 sys = 5.09 CPU) @ 99 +4059.72/s (n=5059764) direct: 4 wallclock secs ( 5.07 usr + -0.01 sys = 5.06 CPU) @ 67 +95643.87/s (n=34385958) Rate accessor direct accessor 994060/s -- -85% direct 6795644/s 584% --

Replies are listed 'Best First'.
Re: Re: Make your classes use their own methods
by petdance (Parson) on Nov 24, 2003 at 19:48 UTC
    Certainly there can be severe overhead in calling functions unnecessarily. Your example accessor is also not optimized very well: It's doing both read and write, and checking for the difference.

    More important is that the programmer know that her use of accessors, in her specific program, is a specific bottleneck. Sure, you might be using accessors in a 100-iteration tight loop, but if you're doing a fetch across the network in between calls to the loop, then that tight loop which may be "inefficient" on its own may be a trivial percentage of execution time.

    Rule 1: Premature optimization is the root of all evil.
    Rule 2: Unmeasured optimiziation is always premature.

    xoxo,
    Andy

      The only question left is whether not using accessor methods within the class should be called "optimization". Sure it improves the speed, but ... does it make the code harder to read? Does it make the class harder to use? Does it make the maintenance any harder?

      The only thing it does is that it forces you to make changes to the code should you need to use the code in some unexpected way. If you never need to do so ... you gained a lot for nothing, if you do, you only need to do a very reasonable amount of work to support the new use.

      You may need to use your class over the network one day, shouldn't it be done and used as a SOAP service even now?

      Update: Thinking about this some more ... maybe what petdance suggests could sometimes be seen as "premature generalization" :-)

      Jenda
      Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
         -- Rick Osborne

      Edit by castaway: Closed small tag in signature