On 9/6/07 4:14 PM, [EMAIL PROTECTED] wrote:
> So why do CPAN modules eschew the use of these and invent their
> own mechanisms that are almost guaranteed to be less powerful?

I agree with all your listed reason, but I think you missed one: minimum
overhead.  Ideally, logging would disappear entirely from the code path when
disabled.  Perl being Perl, this is rarely possible, but that doesn't mean
the other extreme--at least one method call per log line--is suddenly
attractive.  Here's a brief microbench showing the range of overhead for
disabled logging:

package A;
sub a { 0 }
sub c() { 0 }
our $Debug = 0;

package main;
use Benchmark qw(cmpthese);
my $o = bless {}, 'A';
cmpthese(10000000, {
  method => sub { $o->a  && $o->a },
  sub    => sub { A::a() && $o->a },
  var    => sub { $A::Debug && $o->a },
  #const => sub { A::c() && $o->a },
});

             Rate method    sub    var
method  1176471/s     --   -13%   -92%
sub     1349528/s    15%     --   -91%
var    15625000/s  1228%  1058%     --

As you can see, though sub vs. method is a small difference for the best
case (sub and method both returning a constant 0), the $Debug && ... case
beats it by enough to be significant.

(I commented out the constant case because it's best case, as close as Perl
can come to actual code removal (depending on where/when the constant sub is
defined).)

So I guess what I'm saying is that the final thing that would stop me from
using Log::Any "everywhere" (meaning also in performance-critical code) is
the overhead for the common (production) case of logging being entirely
disabled.  How about providing all three methods of checking as part of the
API?

    $log->debug(...)  if $log->is_debug();      # method
    $log->debug(...)  if Log::Any::is_debug();  # sub
    $log->debug(...)  if $Log::Any::Is_Debug;   # var

Yes, a backend (maybe the default/built-in backend, in fact) could chose to
implement the sub by calling a method and the var with a tie, negating a lot
of the performance benefit, but at least the door is open for a simple
backend to implement the var and sub directly, yielding the full benefit.

-John


Reply via email to