sub ENABLE_DEBUG () { 0 }
sub debug { print $_[0]; }
debug 'test' if ENABLE_DEBUG;
You can see the call gets optimized away in the Deparse output:
sub ENABLE_DEBUG () { 0 }
sub debug {
print $_[0];
}
'???';
However, the more elegant equivalent...
sub ENABLE_DEBUG () { 0 }
sub debug { print $_[0] if ENABLE_DEBUG; }
debug 'test';
...does not get optimized away:
sub ENABLE_DEBUG () { 0 }
sub debug {
0;
}
debug 'test';
--Dan
Perhaps a compromise based on something like the following attempt? (Disclaimer: I've not tried this, nor have I ever used Deparse...)
use constant DBG => 0; . . . DBG && print "Any debugging statement\n";If it works, it has the advantage that you can use a larger range of debug helper type statements after the && operator...
--roboticus
sub ENABLE_DEBUG () { 0 }
sub debug_inelegant { print $_[0]; }
sub debug_elegant { print $_[0] if ENABLE_DEBUG; }
use Benchmark qw(:all) ;
cmpthese( 30000000,
{
'inelegant' => "debug_inelegant 'test' if ENABLE_DEBUG;",
'elegant' => "debug_elegant 'test';"
},
);
Output:
Rate elegant inelegant
elegant 3337041/s -- -95%
inelegant 62500000/s 1773% --
--Dan
Good point; what about this?
Lots debug() calls inside a long-running loop, inside many very frequently called subs, running in a virtual server program (with access to only 10% of the CPU), running on a commodity server (Pentium-III 1.3 Ghz), being accessed by many simultaneous clients.
That's a lot different than the Benchmark I just ran on a Athlon64 X2 2.4ghz.
Besides, what about the enjoyment of knowing that there is *no* debugging code in your program?
--Dan
Besides, what about the enjoyment of knowing that there is *no* debugging code in your program?
Enjoyment? In practice, I've found debug vs production optimizations a source of headaches.
Also in practice, I've found the production version is not sufficiently tested. People assume the production version will work because the debug version does.
You'd want to prefer use constant to sub ... () { ... }. Perl core keeps constant more up to date with what's right for the version that's running your perl than your code will ever be. For instance, the 5.9.3+ version is best expressed in a manner *other* than a simple sub ... () { ...}. If you use constant, perl will do the right thing for the perl version you're using. If you're doing it by hand, you may be doing it suboptimally.
⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊
#!/usr/bin/perl -P
sub ENABLE_DEBUG () { 0 }
sub _debug { print $_[0]; }
#define debug(s) _debug(s) if ENABLE_DEBUG
debug("test\n");
perlmonks.org content © perlmonks.org and Anonymous Monk, danb, diotalevi, ikegami, roboticus
prlmnks.org © 2006 edmund von der burg (eccles & toad)
v 0.03