Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

use constant et optimisation en debug

6 réponses
Avatar
Cyrille
Bonjour,

je reviens sur un vieux post
où l'on m'a conseillé d'utiliser des 'use constant'
afin d'optimiser le code entre mode debug ou non debug.
il y a d'ailleurs un article là dessus sur http://www.perlmonks.org/index.pl?node_id=113154

En gros pour mettre des traces dans le code faire :
use constant DEBUG_C => (1);
$log->debug(...) if(DEBUG);

Ca fonctionne très bien,
mais il y a qlq chose que je ne m'explique pas.

Dans le code suivant :

use constant DEBUG=>( 1 );
if( DEBUG ){
print STDERR "### COUCOU ###\n";
sub mySub {
...
}
}

Et bien si DEBUG vaut 0,
le print n'est pas effectué,
par contre la sub mySub existe (je peux l'appeler sans erreur).

C'est surement normal, mais quelle est l'explication de ce comportement ???

merci pour vos lumières,
Cyrille

-==-==-==-
... Faire un don d'ordinateurs déclassés : http://internethon.afnet.fr
-==-==-==-

6 réponses

Avatar
Acide
"Cyrille" wrote in message
news:bqn0kd$ng1$
Bonjour,

je reviens sur un vieux post
où l'on m'a conseillé d'utiliser des 'use constant'
afin d'optimiser le code entre mode debug ou non debug.
il y a d'ailleurs un article là dessus sur
http://www.perlmonks.org/index.pl?node_id3154


En gros pour mettre des traces dans le code faire :
use constant DEBUG_C => (1);
$log->debug(...) if(DEBUG);

Ca fonctionne très bien,
mais il y a qlq chose que je ne m'explique pas.

Dans le code suivant :

use constant DEBUG=>( 1 );
if( DEBUG ){
print STDERR "### COUCOU ###n";
sub mySub {
...
}
}

Et bien si DEBUG vaut 0,
le print n'est pas effectué,
par contre la sub mySub existe (je peux l'appeler sans erreur).

C'est surement normal, mais quelle est l'explication de ce comportement
???


D'apres ce que je vois, tu ne met entre DEBUG l'appel et pas la fonction ?
Si oui dans ce cas tu inhibe simplement l'appel parce car tu en as surement
besoin ailleurs (en tout cas c'est la seul raison algorithmique que je vois)

Sinon si tout est bien entre DEBUG (appel + fonction) je capte pas le
probleme.

Alors ca t'aide ?

Acide.

Avatar
Cyrille
Alors ca t'aide ?
Acide.


non ;o)

Essaye ça et tu comprendras ma question :

#!/usr/local/bin/perl -w
use strict ;
use constant DEBUG=>( 0 );
if( DEBUG ){
print "DEBUG: onn";
sub myFunc {
print "dans myFuncn";
}
}else{
print "DEBUG: offn";
}
myFunc();

Alors ?

-==-==-==-
... FAQ Mozilla/Netscape 7 en français : http://pascal.chevrel.free.fr
-==-==-==-

Avatar
Acide
"Cyrille" wrote in message
news:bqn4f6$u9r$
Alors ca t'aide ?
Acide.


non ;o)

Essaye ça et tu comprendras ma question :

#!/usr/local/bin/perl -w
use strict ;
use constant DEBUG=>( 0 );
if( DEBUG ){
print "DEBUG: onn";
sub myFunc {
print "dans myFuncn";
}
}else{
print "DEBUG: offn";
}
myFunc();

Je suis pas expert en perl, mais c'est de l'interprété et non

un langage compiler. Le scope de ta fonction est visible
de partout. le if(debug) ne servant pas pour ta myfunc.

en fait quand il lit avant d'exécuter ton code perl, il cherche
les sub sans interpreter le code qu'il l'entoure ni le code qu'elle
contient. (verifie la syntaxe et genere un arbre de syntaxe abstraite).

Ta sub tu peux la declarer n'importe ou, il s'en fout. Quand il lit
ton code a la passe execution, il fait debug faux j'appelle myFunc,
jump sur la partie memoire de myFunc, l'execute et c'est tout.

Ce qui veut dire :
* 1 le debug ne doit proteger que l'appel a la fonction
* 2 y a pas de "compilation conditionnelle, genre preprocessueur C"
* 3 : ton arbre d'execution sera plus gros avec cette technique de
debuggage.
si tu entoure la fonction.

Alors ?

Acide.


Avatar
Cyrille
Je suis pas expert en perl, mais c'est de l'interprété et non
un langage compiler. Le scope de ta fonction est visible
de partout. le if(debug) ne servant pas pour ta myfunc.


Merci beaucoup d'avoir pris le temps d'une telle explication.

Du coup il ne doit pas y avoir d'autre méthode plus optimale
pour activer un mécanisme de trace à la compilation qui permette d'avoir un code moins lourd quand on le desactive.

merci
bye
cyrille


-==-==-==-
... Faire un don d'ordinateurs déclassés : http://internethon.afnet.fr
-==-==-==-

Avatar
tyoup
Acide wrote:
Essaye ça et tu comprendras ma question :

#!/usr/local/bin/perl -w
use strict ;
use constant DEBUG=>( 0 );
if( DEBUG ){
print "DEBUG: onn";
sub myFunc {
print "dans myFuncn";
}
}else{
print "DEBUG: offn";
}
myFunc();



Je suis pas expert en perl, mais c'est de l'interprété et non
un langage compiler. Le scope de ta fonction est visible
de partout. le if(debug) ne servant pas pour ta myfunc.


ça n'a rien à voir avec le fait d'être interprété ou non. si l'appel de
myFunc est possible en dehors de la portée du bloc dans lequel la
fonction est définie alors ça vient sûrement de la manière dont est
(doit être ?) compilé/interprété Perl.

si c'est effectivement le cas alors je pense que la solution employée
n'est pas digne d'un bon langage ;> (ya pire ya qu'à voir PHP lol)

ok ce que je dis n'apporte rien (et tout ce que je fais aussi :| ) mais
c'est juste pour mettre mon petit grain de sel =)
juste pour casser les pieds quoi ... :p

--
Tyoup<quoi ? moi je critique ?>
-----<je sais pas pourquoi mais ":|" me fait penser à une grenouille>


Avatar
Ronan Le Hy
Cyrille writes:
use constant DEBUG=>( 1 );
if( DEBUG ){
print STDERR "### COUCOU ###n";
sub mySub {
...
}
}

Et bien si DEBUG vaut 0,
le print n'est pas effectué,
par contre la sub mySub existe (je peux l'appeler sans erreur).


Une sub declaree comme ca :
sub masub { ... }
peut avoir sa definition un peu n'importe ou dans le fichier, elle est
definie pareil et visible partout. L'interet eventuel de la mettre
dans un bloc particulier est d'avoir acces aux variables visibles dans
ce bloc. Elle est compilee et presente dans le package quoi qu'il
arrive (quel que soit la valeur de DEBUG, ici).

S'il s'agit de definir differemment une sub selon la valeur de DEBUG,
(et eventuellement restreindre la visilite de ladite sub), on peut
faire par exemple :
my $debug;
if (DEBUG)
{
$debug = sub { warn @_ }
}
else
{
$debug = sub {};
}
$debug->($message);

Si on veut vraiment eviter le temps de compilation de la sub si DEBUG est
faux, on peut jouer avec require+un module separe, ou eval STRING, je
suppose, mais je ne suis pas sur que ca vaille le coup. S'il y a beaucoup
de fonctions pas souvent utilisees, et qu'on veut economiser sur leur
compilation/stockage, on peut jouer avec AUTOLOAD comme CGI.pm (du coup
elles seront creees dynamiquement une fois pour toutes, uniquement quand
on les utilise).

Ah, et puis il y a
sub debug
{
if (DEBUG)
{
warn @_;
}
}
qui est visiblement correctement simplifie a la compilation.

(
perl -MOÞparse -lwe 'use constant D=>0; sub d{if (D){goto warn}}'
)

HTH

--
Ronan