[log4j] optimisation: tester si niveau actif avant de logger?

optimisation: tester si niveau actif avant de logger? [log4j] - Java - Programmation

Marsh Posté le 07-09-2007 à 18:51:16    

Je me pose une grande question: (utilisant la lib commons d'apache)
 

Code :
  1. LOG.info("texte" );


est t'il plus couteux que de tester avant:

Code :
  1. if (LOG.isInfoEnabled()) LOG.info("texte" );


 
ou alors de toute facon dans la fonction de log le test sera fait assez tot?
J'ai commence a regarder dans le source code de la lib mais je m'y perd un peu avec tout ces appels d'implementation.
 
 
 


---------------
Habillé par Canon, Gallerie web v1.0
Reply

Marsh Posté le 07-09-2007 à 18:51:16   

Reply

Marsh Posté le 07-09-2007 à 22:03:21    

Je me trompe ou le titre prête à confusion avec le post : log4j != jakarta commons logging.
 
Je ne sais pas pour common logging, mais pour log4j il y a ça :
http://logging.apache.org/log4j/1. [...] erformance
 
En pratique, on ne teste que le niveau debug.

Message cité 1 fois
Message édité par charly007 le 07-09-2007 à 23:19:33
Reply

Marsh Posté le 08-09-2007 à 11:31:33    

Citation :

ou alors de toute facon dans la fonction de log le test sera fait assez tot?


La question n'est pas là. Le problème, c'est que LOG.debug(expression) (ou .info) implique que expression soit évaluée. Il sera toujours trop tard quand le test "dois-je logguer" sera réalisé par log4j.
 
Je me tracasserais pas trop pour ce genre de micro-optimisations. En général, je teste isDebugEnabled si l'expression à logger est relativement lourde à évaluer, ou si elle se situe dans une boucle.
 
Dans les autres cas, je ne suis pas certain que c'est là que tu auras des bottlenecks.  
 
Si tu veux vraiment optimiser sans rendre ton code illisible, prévoit une transformation de ta source lors du build pour remplacer tous les LOG.debug en if (LOG.isDebugEnabled) LOG.debug, dont l'overhead est très faible.

Reply

Marsh Posté le 08-09-2007 à 13:14:09    

charly007 a écrit :

Je me trompe ou le titre prête à confusion avec le post : log4j != jakarta commons logging.

 

Je ne sais pas pour common logging, mais pour log4j il y a ça :
http://logging.apache.org/log4j/1. [...] erformance

 

En pratique, on ne teste que le niveau debug.

 

Effectivement me suis trompé dans le titre, c'est commons que j'utilise. Merci pour le lien, j'imagine que le comportement à ce niveau doit etre le meme entre commons logging et log4j.

 


sircam a écrit :

Citation :

ou alors de toute facon dans la fonction de log le test sera fait assez tot?


La question n'est pas là. Le problème, c'est que LOG.debug(expression) (ou .info) implique que expression soit évaluée. Il sera toujours trop tard quand le test "dois-je logguer" sera réalisé par log4j.

 

Je me tracasserais pas trop pour ce genre de micro-optimisations. En général, je teste isDebugEnabled si l'expression à logger est relativement lourde à évaluer, ou si elle se situe dans une boucle.

 

Dans les autres cas, je ne suis pas certain que c'est là que tu auras des bottlenecks.

 

Si tu veux vraiment optimiser sans rendre ton code illisible, prévoit une transformation de ta source lors du build pour remplacer tous les LOG.debug en if (LOG.isDebugEnabled) LOG.debug, dont l'overhead est très faible.

 

Hum pas con ton idée de pré-formater le code avant build, faut que je regarde comment on fait ça dans Eclipse.
Donc sinon je comprends que ça peut valoir le coup pour le niveau debug (ou plus bas) vu qu'il y en a génaralement bien plus que les autres, et donc eviter un certain nombre d'evaluation des parametres.
Comme c'est une application qui mouline assez vite, je ferais le test au moins pour les appel a debug avec evaluation un chouilla couteuse.

 

En tout cas c'est bien plus clair pour moi maintenant, merci à vous deux!  :jap:

 


Message édité par cybercouf le 08-09-2007 à 13:14:27

---------------
Habillé par Canon, Gallerie web v1.0
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed