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

Thank you - I feel much better now. Oh the fun of pre-processing...

Rate normal optimized direct normal 172740/s -- -28% -60% optimized 239252/s 39% -- -45% direct 433898/s 151% 81% --

That looks a little more like what I expected.

Replies are listed 'Best First'.
Re^4: Unexpected OO accessor benchmarks
by Fletch (Bishop) on Feb 09, 2007 at 20:42 UTC

    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.

      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