web-dev-qa-db-fra.com

Logger slf4j avantages du formatage avec {} au lieu de la concaténation de chaînes

Y a-t-il un avantage à utiliser {} au lieu de la concaténation de chaînes?

Un exemple de slf4j

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

au lieu de

logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);

Je pense que cela concerne l'optimisation de la vitesse car l'évaluation des paramètres (et la concaténation de chaînes) pourrait être évitée à l'exécution en fonction d'un fichier de configuration. Mais seuls deux paramètres sont possibles. Parfois, il n’ya pas d’autre choix que la concaténation de chaînes. Besoin de points de vue sur cette question.

80
Hernán Eche

Il est à propos des performances de concaténation de chaînes. C'est potentiellement important si vous avez des relevés de consignation denses.

(Avant SLF4J 1.7) Mais seulement deux paramètres sont possibles

Étant donné que la grande majorité des instructions de consignation ont 2 paramètres ou moins, l’API SLF4J jusqu’à la version 1.6 couvre (uniquement) la majorité des cas d’utilisation. Les concepteurs d'API ont fourni des méthodes surchargées avec des paramètres varargs depuis la version 1.7 de l'API.

Dans les cas où vous avez besoin de plus de 2 et que vous êtes bloqué avec une version antérieure à 1.7 SLF4J, utilisez simplement la concaténation de chaînes ou new Object[] { param1, param2, param3, ... }. Ils devraient être assez peu nombreux pour que la performance ne soit pas aussi importante.

61
skaffman

Version courte: Oui, c'est plus rapide, avec moins de code!

La concaténation de chaînes effectue beaucoup de travail sans savoir si elle est nécessaire ou non (le test traditionnel "est le débogage activé" connu de log4j), et doit être évitée si possible, car le {} permet de retarder la construction de l'appel et de la chaîne toString () après, il a été décidé si l'événement doit être capturé ou non. En ayant le format de l'enregistreur une chaîne single, le code devient plus propre à mon avis.

Vous pouvez fournir un nombre quelconque d'arguments. Notez que si vous utilisez une ancienne version de sljf4j et que vous avez plus de deux arguments pour {}, vous devez utiliser le new Object[]{a,b,c,d} syntaxe pour passer un tableau à la place. Voir par exemple http://slf4j.org/apidocs/org/slf4j/Logger.html#debug (Java.lang.String, Java.lang.Object []) .

En ce qui concerne la rapidité: Ceki a inscrit un repère il y a quelque temps sur l'une des listes.

Puisque String est immuable en Java, les chaînes gauche et droite doivent donc être copiées dans la nouvelle chaîne pour chaque paire de concaténation. Alors, mieux vaut aller pour l'espace réservé.

6
Rabin Pantha

Une autre alternative est String.format(). Nous l'utilisons dans jcabi-log (utilitaire statique autour de slf4j).

Logger.debug(this, "some variable = %s", value);

C'est beaucoup plus maintenable et extensible. En plus, c'est facile à traduire.

3
yegor256

Je pense que du point de vue de l'auteur, la raison principale est de réduire les frais généraux liés à la concaténation de chaînes. Je viens de lire la documentation de l'enregistreur, vous pouvez trouver les mots suivants:

/**
* <p>This form avoids superfluous string concatenation when the logger
* is disabled for the DEBUG level. However, this variant incurs the hidden
* (and relatively small) cost of creating an <code>Object[]</code> before 
  invoking the method,
* even if this logger is disabled for DEBUG. The variants taking
* {@link #debug(String, Object) one} and {@link #debug(String, Object, Object) two}
* arguments exist solely in order to avoid this hidden cost.</p>
*/
*
 * @param format    the format string
 * @param arguments a list of 3 or more arguments
 */
public void debug(String format, Object... arguments);
2
Tianhao Wang