Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Perl::Critic policy for common Log::Log4perl mistake

by thargas (Deacon)
on Nov 07, 2011 at 19:48 UTC ( [id://936566]=note: print w/replies, xml ) Need Help??


in reply to Perl::Critic policy for common Log::Log4perl mistake

Please read that link to Log4perl again. The Log4perl author is *not* suggesting that every logging call should be wrapped, but rather that *expensive* calls should be. Since only the application developer can be expected to be able to tell which calls would be expensive, IMHO using such a Perl::Critic policy (if it exists) would be both code bloat and slow down the application, exactly the opposite to the effect the OP seems to be trying to achieve.
  • Comment on Re: Perl::Critic policy for common Log::Log4perl mistake

Replies are listed 'Best First'.
Re^2: Perl::Critic policy for common Log::Log4perl mistake
by andreas1234567 (Vicar) on Nov 08, 2011 at 13:53 UTC
    The following Benchmarked code snipped shows a 10-15% performance increase by simply wrapping the log calls. Note that it is just a scalar being logged (suppressed, actually), not even an array, an especially not a super-long array. I don't find it to be particularly bloated either:
    $ perl l4p_bench.pl x86_64-linux Rate fib_log_buffer fib_log_buffer_is +_chk fib_log_buffer 15605/s -- +-11% fib_log_buffer_is_chk 17454/s 12% + --
    --
    No matter how great and destructive your problems may seem now, remember, you've probably only seen the tip of them. [1]

      Then add this to your test:

      sub fib_no_log { my @fibonacci = (0, 1); my ($n, $sum) = (1, 0); while ($n < 1_000_000) { $n = $fibonacci[$#fibonacci] + $fibonacci[ $#fibonacci - 1 ]; push @fibonacci, $n; $sum += $n if (($n % 2) == 0); } return $sum; } ... 'fib_no_log' => sub { fib_no_log() },

      and you will get this result:

      Rate fib_log_buffer fib_log_buffer_is_chk f +ib_no_log fib_log_buffer 11712/s -- -13% + -68% fib_log_buffer_is_chk 13525/s 15% -- + -63% fib_no_log 36540/s 212% 170% + --

      Why? Because even the call to is_debug takes twice as long as the rest, the "meat" of your loop. Obviously you should have a perl_critic rule to warn from use of log4perl at all. Or avoid artificial benchmarks ;-)

        Having logging and the ability to alter logging in run-time is in this case an important requirement. Removing logging is of course faster, but also makes the code irrelevant.

        The objective is to allow for logging and make it reasonably fast.

        --
        No matter how great and destructive your problems may seem now, remember, you've probably only seen the tip of them. [1]

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://936566]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (3)
As of 2024-04-19 22:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found