Nous devons constamment construire des chaînes de caractères pour la sortie des journaux, etc. Au fil des versions du JDK, nous avons appris à utiliser les éléments suivants StringBuffer
(nombreux ajouts, thread safe) et StringBuilder
(nombreux ajouts, non sécurisé par les threads).
Quel est le conseil pour utiliser String.format()
? Est-elle efficace, ou sommes-nous obligés de nous en tenir à la concaténation pour les phrases d'une ligne lorsque les performances sont importantes ?
Par exemple, le vieux style laid,
String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";
contre un nouveau style soigné (String.format, qui est peut-être plus lent),
String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);
Remarque : mon cas d'utilisation spécifique concerne les centaines de chaînes d'enregistrement en une seule ligne dans mon code. Elles n'impliquent pas de boucle, donc StringBuilder
est trop lourd. Je suis intéressé par String.format()
spécifiquement.
32 votes
Pourquoi ne pas le tester ?
1 votes
Si vous produisez cette sortie, je suppose qu'elle doit être lisible par un humain à un rythme qui lui est propre. Disons 10 lignes par seconde au maximum. Je pense que vous trouverez que l'approche que vous prenez n'a pas vraiment d'importance, si elle est théoriquement plus lente, l'utilisateur pourrait l'apprécier. ;) Donc non, StringBuilder n'est pas un poids lourd dans la plupart des situations.
11 votes
@Peter, non, ce n'est absolument pas pour être lu en temps réel par des humains ! Il est là pour aider à l'analyse lorsque les choses tournent mal. La sortie du journal sera typiquement des milliers de lignes par seconde, donc elle doit être efficace.
5 votes
Si vous produisez plusieurs milliers de lignes par seconde, je vous suggère 1) d'utiliser un texte plus court, voire aucun texte comme du CSV brut, ou du binaire 2) de ne pas utiliser de String du tout, vous pouvez écrire les données dans un ByteBuffer sans créer d'objets (comme du texte ou du binaire) 3) de mettre en arrière-plan l'écriture des données sur le disque ou sur une socket. Vous devriez être capable de supporter environ 1 million de lignes par seconde. (En gros, autant que votre sous-système de disque le permet) Vous pouvez atteindre des rafales de 10x ce chiffre.
7 votes
Ce n'est pas pertinent pour le cas général, mais pour la journalisation en particulier, LogBack (écrit par l'auteur original de Log4j) a une forme de journalisation paramétrée qui aborde ce problème exact - logback.qos.ch/manuel/architecture.html#ParametrizedLogging
0 votes
En passant, au moins l'implémentation Harmony/Android de la fonction
String.format()
utilise unStringBuilder
interne. Ainsi, siString.format()
serait bien,StringBuilder
seul, ça ira aussi.