Stephen Zander wrote:
> 
> As Matt has already commented, in the handler the method call
> overheads swamps all the other activities.

Just to clarify: that's only important if you are doing very few other
activities, or if those other activities also include a high percentage 
of method calls:

###### Using an empty A::a() (see below):

Benchmark: running $a->a(), A->a(), A::a( "A" ), A::a( $a ), A::a(), a(), each for at 
least 3 CPU seconds...
   $a->a():  4 wallclock secs ( 3.24 usr +  0.02 sys =  3.26 CPU) @ 511465.64/s 
(n=1667378)
    A->a():  2 wallclock secs ( 3.28 usr +  0.00 sys =  3.28 CPU) @ 290696.34/s 
(n=953484)
A::a( "A" ):  3 wallclock secs ( 3.08 usr +  0.00 sys =  3.08 CPU) @ 610704.55/s 
(n=1880970)
A::a( $a ):  3 wallclock secs ( 3.07 usr +  0.00 sys =  3.07 CPU) @ 623101.63/s 
(n=1912922)
    A::a():  3 wallclock secs ( 3.22 usr +  0.00 sys =  3.22 CPU) @ 611970.19/s 
(n=1970544)
       a():  3 wallclock secs ( 3.14 usr +  0.00 sys =  3.14 CPU) @ 622945.22/s 
(n=1956048)

                Rate   A->a()  $a->a() A::a( "A" )   A::a()       a() A::a( $a )
A->a()      290696/s       --     -43%        -52%     -52%      -53%       -53%
$a->a()     511466/s      76%       --        -16%     -16%      -18%       -18%
A::a( "A" ) 610705/s     110%      19%          --      -0%       -2%        -2%
A::a()      611970/s     111%      20%          0%       --       -2%        -2%
a()         622945/s     114%      22%          2%       2%        --        -0%
A::a( $a )  623102/s     114%      22%          2%       2%        0%         --

###### And doing some trivial work in A::a():

[barries@jester tmp]$ perl ./cmp2
Name "A::b" used only once: possible typo at ./cmp2 line 7.
Benchmark: running $a->a(), A->a(), A::a( "A" ), A::a( $a ), a(), each for at least 3 
CPU seconds...
   $a->a():  5 wallclock secs ( 3.19 usr +  0.00 sys =  3.19 CPU) @ 64346.39/s 
(n=205265)
    A->a():  4 wallclock secs ( 3.21 usr +  0.00 sys =  3.21 CPU) @ 54105.30/s 
(n=173678)
A::a( "A" ):  2 wallclock secs ( 3.09 usr +  0.00 sys =  3.09 CPU) @ 70333.66/s 
(n=217331)
A::a( $a ):  3 wallclock secs ( 3.19 usr +  0.00 sys =  3.19 CPU) @ 68128.84/s 
(n=217331)
       a():  4 wallclock secs ( 3.10 usr +  0.00 sys =  3.10 CPU) @ 72231.29/s 
(n=223917)

               Rate      A->a()     $a->a()  A::a( $a ) A::a( "A" )         a()
A->a()      54105/s          --        -16%        -21%        -23%        -25%
$a->a()     64346/s         19%          --         -6%         -9%        -11%
A::a( $a )  68129/s         26%          6%          --         -3%         -6%
A::a( "A" ) 70334/s         30%          9%          3%          --         -3%
a()         72231/s         34%         12%          6%          3%          --



You can see that even doing a few things in A::a() cause the relative slowdown
due to method call overhead to drop significantly.  I suspect that your opcode
count has more to do with it than method overhead, unless I've goofed the
benchmarks somehow.

Hmmm, maybe this shows it best (though I did tweak aggrlist_print to
print STDERR):


[barries@jester tmp]$ perl ./aggr_cmp  2> /dev/null
Benchmark: running $a->aggrlist_print(), A->aggrlist_print(), aggrlist_print( $a ), 
each for at least 3 CPU seconds...
$a->aggrlist_print():  3 wallclock secs ( 2.69 usr +  0.41 sys =  3.10 CPU) @ 
15104.19/s (n=46823)
A->aggrlist_print():  3 wallclock secs ( 2.72 usr +  0.41 sys =  3.13 CPU) @ 
14492.01/s (n=45360)
aggrlist_print( $a ):  3 wallclock secs ( 2.81 usr +  0.24 sys =  3.05 CPU) @ 
15529.18/s (n=47364)

                        Rate A->aggrlist_print() $a->aggrlist_print() aggrlist_print( 
$a )
A->aggrlist_print()  14492/s                  --                  -4%                  
-7%
$a->aggrlist_print() 15104/s                  4%                   --                  
-3%
aggrlist_print( $a ) 15529/s                  7%                   3%                  
 --


- Barrie

[barries@jester tmp]$ cat cmp
#!/usr/local/bin/perl -w

## cmp

package A ;

use Benchmark qw( cmpthese ) ;

sub a {}

my $a = bless {}, 'A' ;

cmpthese( -3, {
   'a()'         => sub { a() },
   'A::a()'      => sub { A::a() },
   'A::a( "A" )' => sub { A::a( "A" ) },
   'A::a( $a )'  => sub { A::a( $a )  },
   'A->a()'      => sub { A->a()      },
   '$a->a()'     => sub { $a->a()     },
} ) ;


[barries@jester tmp]$ cat cmp2
#!/usr/local/bin/perl -w

## cmp2

package A ;

$b = {} ;

sub a {
   my $self = shift ;
   my ( $a, $b, $c ) = @_ ;
   $b->{FOO} = 'bar' ;
}

use Benchmark qw( cmpthese ) ;

my $a = bless {}, 'A' ;

cmpthese( -3, {
   'a()'         => sub { a()         },
   'A::a( "A" )' => sub { A::a( "A" ) },
   'A::a( $a )'  => sub { A::a( $a )  },
   'A->a()'      => sub { A->a()      },
   '$a->a()'     => sub { $a->a()     },
} ) ;


[barries@jester tmp]$ cat aggr_cmp 
#!/usr/local/bin/perl -w

package A ;

sub aggrlist_print{
   my @buffer = ();
   push @buffer,"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n";
   push @buffer,"<HTML>\n";
   push @buffer,"  <HEAD>\n";
   push @buffer,"    <TITLE>\n";
   push @buffer,"      Test page\n";
   push @buffer,"    </TITLE>\n";
   push @buffer,"  </HEAD>\n";
   push @buffer,"  <BODY BGCOLOR=\"black\" TEXT=\"white\">\n";
   push @buffer,"    <H1> \n";
   push @buffer,"      Test page \n";
   push @buffer,"    </H1>\n";
   push @buffer,"    <A HREF=\"foo.html\">foo</A>\n";
   push @buffer,"    <HR>\n";
   push @buffer,"  </BODY>\n";
   push @buffer,"</HTML>\n";
   print STDERR @buffer;



use Benchmark qw( cmpthese ) ;

my $a = bless {}, 'A' ;

cmpthese( -3, {
   'aggrlist_print( $a )' => sub { aggrlist_print( $a ) },
   'A->aggrlist_print()'  => sub { A->aggrlist_print()  },
   '$a->aggrlist_print()' => sub { $a->aggrlist_print() },
} ) ;

Reply via email to