Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

Re: Re: Re: Am I missing something here?

by Biker (Priest)
on Nov 07, 2001 at 20:05 UTC ( #123837=note: print w/replies, xml ) Need Help??

in reply to Re: Re: Am I missing something here?
in thread Am I missing something here?

This will allways call the Debug() sub. The overhead may or may not be a problem in your production systems, it all depends on how many times this call is executed.

Imagine a few thousand times per minute. (Or per second...)

I propose the alternative solution:

$debug=1; $debug&&print("Debug info...\n");

The above should require less overhead. I've even read somewhere that Perl optimizes this so that the $debug&& doesn't have to evaluated, but unfortunately I can't find back the reference to that text. :-( Maybe some of the well educated Monks may chime in about that?

If there is no reason to change the value of $debug during execution, the following should be even smarter(?):
*DEBUG=\1; $DEBUG&&print("Debug info...\n");

f--k the world!!!!
/dev/world has reached maximal mount count, check forced.

Replies are listed 'Best First'.
(lestrrat) Do use 'constant': Re(4): Am I missing something here?
by lestrrat (Deacon) on Nov 08, 2001 at 23:09 UTC

    I'm sure your way is more efficient compared to calling a sub all the time, but I would definitely push for "use constant" in this scenario, especially if you're concerned with efficiency

    Suppose the following is in a file called "":

    *DEBUG = \1; use constant CONST_DEBUG => 1; $DEBUG && print "foo\n"; CONST_DEBUG && print "bar\n";

    They look pretty much the same, but you should see the output of perl -MO=Deparse

    ## Output of perl -MO=Deparse on my machine with perl 5.6.1: *DEBUG=\(1); sub CONST_DEBUG() { package constant; $scalar; } print "foo\n" if $DEBUG; # <- $DEBUG must be evaluated each time print "bar\n"; # <- there's no evaluation... just straight print()'ing

    There you see that the second option gives you a literal print "bar\n" without needing to evaluate another variable.

    This is because of a couple of reasons: 1 - the perl compiler is smart enough to optimize away "real" constants... and 2 - *DEBUG = \1 is NOT a "real" constant. (You can always assign on top of *DEBUG if you so choose to).

      And Biker humbly bowes his head in respect. Amen.

      f--k the world!!!!
      /dev/world has reached maximal mount count, check forced.

Re4: Am I missing something here?
by blakem (Monsignor) on Nov 08, 2001 at 00:47 UTC

      Blake, thanks for the "probably". Much appreciated. ;-)

      As always, TIMTOWTDI. I prefer my way, since I think it's clearer, but I 100% respect your different point of view. I do let out my thoughts on this elsewhere.

      Hopefully, the original poster has got several useful hints and tips for how to go forward.

      f--k the world!!!!
      /dev/world has reached maximal mount count, check forced.


        Yes, I've gotten a little more help since I've never tried this kind of debugging's kinda fun, but frustrating because I still can't figure it out...I'll keep trying though.

        Totally! Thanks for everyone's input. If it weren't for you guys, I'd still be stuck on "#!" :-)


Log In?

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

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (4)
As of 2023-01-30 21:25 GMT
Find Nodes?
    Voting Booth?

    No recent polls found