2017-07-24 4 views
1

Le Log4j 2 manual donne un exemple de la façon d'utiliser lambdas pour « l'exploitation forestière paresseux »:Log4j 2 lambda « de l'enregistrement paresseux »

logger.trace("Some long-running operation returned {}",() -> expensiveOperation()); 

Il donne aussi un exemple de la façon d'utiliser les paramètres de format pour éviter concaténation de chaînes inutiles:

logger.debug("Logging in user {} with birthday {}", user.getName(), user.getBirthdayCalendar()); 

Ma question: Puis-je obtenir les mêmes avantages de performance en fournissant simplement un lambda avec une approche de concaténation de chaîne normale?

logger.trace(() -> "Concatting " + user.getName() + " with " + expensiveOperation()); 

Répondre

2

les plus performants dans votre exemple serait

logger.trace("Concatting {} with {}",() -> user.getName(),() -> expensiveOperation()); 

De cette façon

  1. Aucune des méthodes est appelée à moins que le niveau de débogage est TRACE
  2. Aucun objets String sont créés: Log4j2 utilise un StringBuilder threadlocal sous le capot pour être sans déchets
  3. Vous évitez allouer une concaténation temporaire StringBuilder for String (ce que Java fait sous le capot lorsque vous "+" deux chaînes)
+0

Cela efface les choses. Merci! –