>>      local $Log::Log4perl::caller_depth =
>>                    $Log::Log4perl::caller_depth + 2;
>
> I should have said I knew I could do this but a) there
> are an awful lot of methods b) when logging is not
> enabled each method has the overhead of the above
> statement for nothing.

Well, that's true, but the overhead is dwarfed by what it's already
costing you to subclass the DBI methods.  On my box I can process
196,002 child-method calls per second, and that decreases to 176,991
calls per second when adding the manipulation of $caller_depth.  On the
other hand, calling the parent method would have run at 1,689,189 per
second.

And you could probably improve the performance of manipulating
$caller_depth by skipping it unless $h->{logger}->is_debug is true.

call_local:  3 wallclock secs ( 1.92 usr +  0.00 sys =  1.92 CPU) @
2604166.67/s (n=5000000)
child_with_local: 29 wallclock secs (28.19 usr +  0.06 sys = 28.25 CPU)
@ 176991.15/s (n=5000000)
childmethod: 26 wallclock secs (25.47 usr +  0.04 sys = 25.51 CPU) @
196001.57/s (n=5000000)
supermethod:  3 wallclock secs ( 2.95 usr +  0.01 sys =  2.96 CPU) @
1689189.19/s (n=5000000)

----------------
use strict;
use Benchmark;

$Log::Log4perl::caller_depth = 0;

{ package testpackage;
  sub runmethod {}
}

{ package child::testpackage;
  push our @ISA, 'testpackage';
  sub runmethod {
     my($sth, @args) = @_;
     my $h = $sth->{private_DBIx_Log4perl};
     my $res = $sth->SUPER::runmethod(@args);
  }
  #the same thing, but with a local() call added
  sub runmethod_with_local {
     my($sth, @args) = @_;
     local $Log::Log4perl::caller_depth =
                    $Log::Log4perl::caller_depth + 2
        if ;
     my $h = $sth->{private_DBIx_Log4perl};
     my $res = $sth->SUPER::runmethod(@args);
  }
}

my $dbh = {};
bless $dbh, 'testpackage';
my $dbhX = {private_DBIX_Log4perl => 1};
bless $dbhX, 'child::testpackage';


my @args = (1,2,3);
timethese( 5000000, {
    supermethod =>      sub { $dbh->runmethod(@args) },
    childmethod =>      sub { $dbhX->runmethod(@args) },
    child_with_local => sub { $dbhX->runmethod_with_local(@args) },
    call_local =>      sub { local $Log::Log4perl::caller_depth =
                    $Log::Log4perl::caller_depth + 2; },

});




-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
log4perl-devel mailing list
log4perl-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/log4perl-devel

Reply via email to