2010-09-09 4 views

Répondre

7

Dans ce cas, j'utiliser B.

Toutefois, si la construction du message de journal (l'argument à log.Debug) peut prendre un moment - impliquant une concaténation de chaînes importante, par exemple - alors je voudrais aller pour A. Il finira par effectuer le même test deux fois dans le cas "oui, connectez-vous", mais il n'aura pas besoin de construire le journal message dans le cas "non, ne pas l'enregistrer".

1

Même si la première option est légèrement plus performante, je ne m'inquiéterais pas autant.

Toutefois, si vous faites quelque chose comme ceci:

_log.Debug(String.Format("{0} {1} {2}...", param1, param2, param3)); 

alors il est un cas solide pour la vérification _log.IsDebugEnabled avant.

4

Je choisirais l'option B à moins que le message de journal lui-même prenne beaucoup de temps à construire. Le gain de performance pour le cas habituel est négligeable ou n'existe même pas. En interne, log4net effectue la même vérification de sorte que vous ne changerez rien en le faisant vous-même.

Mais comme je le disais, l'option A peut être une bonne idée dans une situation comme celle-ci:

if (_log.IsDebugEnabled()) 
{ 
    var message = createComplicatedLogMessageThatTakesALotOfTime(); 
    _log.Debug(message); 
} 

Pour tous les autres cas, il ajoute que trois autres lignes pour chaque message que vous ouvrez une session qui est tout simplement pas vaut la peine.

2

Une analyse précédente a révélé que l'implémentation IsXXXEnabled de Log4Net n'est pas la plus rapide car elle appelle plusieurs autres méthodes. La version de NLog fait une lecture volatile, donc c'est beaucoup plus rapide, mais vraiment, si votre goulot d'étranglement se trouve dans IsXXXEnabled vous faites déjà des trucs à faible latence et pourriez finir par faire cuire votre propre journalisation dédiée.

+0

pourriez-vous être plus précis sur votre «analyse précédente»? – Zonko

+0

Saisir un décompilateur et passer par IsXXX de Log4Net activé - vous passez plusieurs appels de méthode virtuelle. –

0

Option A est meilleur, parce que:

Vous ne savez probablement pas ce qui est enveloppé derrière la méthode de débogage(). Est-ce un wrapper local que quelqu'un a ajouté pour traiter une logique supplémentaire avant de passer à l'appel Debug() de log4net? Que fait log4net dans cette méthode? Vous utilisez peut-être la source de log4net pour créer votre assembly, est-ce qu'un autre membre de l'équipe l'a modifié? Ok, donc vous avez personnellement vérifié le code, et c'est très rapide et vous utilisez l'assembly de Nuget, donc vous savez que personne dans votre équipe ne l'a changé. Qu'en est-il demain quand une nouvelle version de log4net tombe? Comment savez-vous que quelqu'un qui travaille sur un bogue log4net n'a pas introduit de code de journalisation qui fait fondre votre serveur dans toutes vos boucles serrées? Le stagiaire suivant copie-t-il votre code et apporte-t-il des modifications aussi bien informées que vous et en pensant à la façon dont la réalisation d'appels logiques complexes peut être plus coûteuse que prévu? De plus, gardez à l'esprit que différents appenders peuvent avoir des coûts de journalisation différents. Que se passe-t-il si quelqu'un change un appendeur asynchrone léger et léger pour un synchrone lent et synchrone?

Ligne de fond: code de manière défensive. C'est une vérification booléenne qui est vraiment simple et peu coûteuse, et elle pourrait éviter des problèmes de performances inattendus et délicats à l'échelle et sous la charge.Allez-vous jamais regarder cette vérification et dire: «Je regrette vraiment d'avoir écrit ça? Improbable.

+0

Pour déboguer cela peut être le cas mais pour d'autres méthodes comme log() et après avoir regardé des centaines de lignes de vérification if, alors il commence à gonfler le code et n'a plus de sens. – user441521

Questions connexes