Source filters can be a solution. very little overhead. I wrote
Filter::Uncomment just for that.
On Friday 07 September 2007 03:58, John Siracusa wrote:
> 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