Je regarde dans la journalisation C # et je ne veux pas que mes messages de journal ne dépensent aucun traitement de temps si le message est inférieur au seuil de journalisation. Le mieux que je puisse voir log4net est une vérification de seuil après avoir évalué les paramètres du journal.
Exemple: P>
LOG_DEBUG( "My complicated log message " + thisFunctionTakesALongTime() + " will take no time" )
4 Réponses :
Si vous pouvez cible .NET 3.5 (C # 3.0), vous pouvez utiliser méthodes d'extension pour envelopper le afin que vous puissiez faire l'équivalent "macro": p> en enveloppant l'enregistrement Cette méthode: p> si code> instelements.
Mais si je suis en train d'évaluer les fonctions pour obtenir le message de journal, cela ne serait-il pas aussi lent? Je veux éviter toutes les évaluations de la fonction si le niveau de journal est inférieur à mon seuil.
Vous avez raison que vous devrez retarder l'évaluation de la fonction. Voir ma mise à jour qui utilise un délégué anonyme.
D'Oh, c'était ma réponse aussi. Je devrais vous avertir que si vous recherchez une vitesse, vous ne voulez pas utiliser les délégués. Vous devriez simplement prendre le coup et utiliser si si (logger.isdebugenabled) code> autour de tout ce cher. Il n'y a pas de solution qui est à la fois performante et élégante.
@Bobbymcr: Performant est relatif. L'invocation des délégués est au même niveau que tout appel de fonction INTEFACE, où thisfunkstakesalongtime () code> pourrait exécuter une simulation de Monte Carlo qui prend des jours.
@Jeff: Je parle de la performance entre l'utilisation d'un délégué pour une évaluation conditionnelle contre un simple chèque booléen. Consultez ma réponse ci-dessous - il s'agit d'un coup de 20% + de performances pour l'utilisation de la Lambda lorsque la journalisation n'est pas activée. La règle simple est si la performance est critique, n'utilisez pas la liaison tardive.
sans préprocesseur, vous êtes sol. Bien sûr, rien ne vous empêche d'en utiliser un avant d'alimenter votre code au compilateur C #. P>
Délégués anonymes et classes supplémentaires - Wow c'est beaucoup de dactylographie.
Le problème ici est que tous les paramètres de la méthode doivent être évalués avant l'appel de la méthode. Il n'y a aucun moyen de cela, étant donné la syntaxe que vous utilisez. Étant donné que c # n'a pas de préprocesseur ou de macros réel, vous ne pouvez rien faire de "log_debug". Le mieux que vous puissiez faire est d'utiliser La seule chose à laquelle je peux penser est peut-être en utilisant quelque chose comme une expression de Lambda pour retarder l'évaluation. Mais je vous avertiais que Cela aura presque certainement plus de performances à la fin de la fin forte>. P> si (logger.isdebugenable) code> comme suggéré.
Les expressions Lambda sont-elles coûteuses?
@Chals: Les Lambdas sont relativement peu coûteux jusqu'à la reliure tardive, mais beaucoup plus chères qu'un chèque booléen et un appel de méthode. Dans mon test simple sur un milliard d'itérations (code ici: Pastebin.com/artmtsxz ), j'ai mesuré environ 25% Les frais généraux pour la vérification de Lambda vs Boolean lorsque la journalisation n'était pas activée. Avec une Lambda mis en cache (sauvegardez la Lambda dans un champ afin qu'il ne soit pas ré-généré à chaque fois), il y a un peu moins de frais généraux (une litière inférieure à 20%).
17.4.2 L'attribut conditionnel
L'attribut conditional permet la définition des méthodes conditionnelles. L'attribut conditionnel indique une condition en testant un symbole de compilation conditionnel. Les appels vers une méthode conditionnelle sont soit inclus ou omis selon que ce symbole soit défini au point de l'appel. Si le symbole est défini, l'appel est inclus. Sinon, l'appel (y compris l'évaluation des paramètres de l'appel) est omis. p>
C'est intéressant, je ferai d'autres recherches sur elle. MSDN: msdn.microsoft.com/en-us/ Bibliothèque / AA664622% 28VS.71% 29.aspx
Je supposerais que les meilleures bibliothèques de journalisation utilisent déjà cette technique.
Juste parce que vous appelez une méthode "logger.debug" ne signifie pas que vous exécutez en mode de débogage. Le nom "Débogage" est vraiment juste un nom de méthode pour un seuil arbitraire tel que défini par le développeur d'applications. Je serais surpris si Log4net, EntrepriseLibrary, etc ... utilise réellement tous les attributs conditionnels car l'attribut s'appuie sur la présence d'un symbole de compilation.
Créez deux versions de la méthode du journal - avec et sans compilation conditionnelle, c'est-à-dire LOGLING () et LOGLINECONDITIONAL (), vous pouvez ainsi choisir lequel à utiliser, par exemple. Utilisez LOGLINECONDITIONNEL () dans les zones sensibles à la performance. Aussi utile d'utiliser une chaîne conditionnelle qui est pas i> "débogage" afin que cela puisse être contrôlé séparément de la construction de débogage.