in reply to Re^3: Unexpected OO accessor benchmarks
in thread Unexpected OO accessor benchmarks

It's not preprocessing. You pass a hashref to cmpthese, the values of which are computed when that line of code is executed. Those values in this case are method invocations which are evaluated where they occur. It should be no more surprising than some_sub( $obj->method() ) calling that sub with the value returned from the method call.

Replies are listed 'Best First'.
Re^5: Unexpected OO accessor benchmarks
by cLive ;-) (Prior) on Feb 10, 2007 at 00:55 UTC
    I should have probably not mentioned pre-processing out of context :) The code I'm analyzing is going to be optimized before publishing. So all calls of type a() would be replaced using a regex with type c() throughout the codebase, and then the accessor sub can be deleted. Assuming the gains are worth it in terms of performance increase - but that's what I'm trying to determine ;-)

      Since the slowest version is running 646k iterations per second on my machine I think you should probably look elsewhere for ways to improve your code. I would think that the risk of using regex to modify code is not justified by such a very very minimal optimization.

      Update: forgot the code the first time ;)

      #!/usr/bin/perl use strict; use warnings; use Benchmark 'cmpthese'; my $self = bless [123], '::main'; cmpthese( 10_000_000 , { normal => sub { $self->get_value() }, optimized => sub { $self->get_value2() }, direct => sub { $self->[0] }, }); exit(0); sub get_value { my $self = shift; return $self->[0]; } sub get_value2 { $_[0]->[0]; } __END__ C:\Perl\test>perl methods_access_599259.pl Rate normal optimized direct normal 646454/s -- -29% -92% optimized 915583/s 42% -- -89% direct 8532423/s 1220% 832% --

      ___________
      Eric Hodges