Votre explication de la raison pour laquelle elle est inefficace est exacte, dans au moins les langages que je connais (C, Java, C #), bien que je ne pense pas qu'il soit universellement courant d'effectuer des quantités massives de concaténation de chaînes. Dans le code C # Je travaille, il y a l' utilisation abondante de StringBuilder
, String.Format
, etc. , qui sont tous techiniques sauver la mémoire pour éviter une réaffectation.
Donc, pour obtenir la réponse à votre question, nous devons poser une autre question: s'il n'est jamais vraiment un problème de concaténer des chaînes, pourquoi les classes aimeraient-elles StringBuilder
et StringBuffer
existeraient-elles ? Pourquoi l'utilisation de telles classes est-elle incluse dans les livres et les classes de programmation même semi-débutants? Pourquoi les conseils d'optimisation apparemment prématurés seraient-ils si importants?
Si la plupart des développeurs de concaténation de chaînes fondaient leur réponse uniquement sur l'expérience, la plupart diraient que cela ne fait aucune différence et éviteraient l'utilisation de tels outils en faveur du "plus lisible" for (int i=0; i<1000; i++) { strA += strB; }
. Mais ils ne l'ont jamais mesuré.
La vraie réponse à cette question pourrait être trouvée dans cette réponse SO , qui révèle que dans un cas, lors de la concaténation de 50000 chaînes (qui, selon votre application, peut être un phénomène courant), même les plus petites, ont abouti à un résultat de performance de 1000x .
Si la performance ne signifie littéralement rien, concaténer loin. Mais je ne serais pas d'accord que l'utilisation d'alternatives (StringBuilder) est difficile ou moins lisible , et serait donc une pratique de programmation raisonnable qui ne devrait pas invoquer la défense "d'optimisation prématurée".
METTRE À JOUR:
Je pense que cela revient à connaître votre plate-forme et à suivre ses meilleures pratiques, qui ne sont malheureusement pas universelles . Deux exemples de deux "langues modernes" différentes:
- Dans une autre réponse SO , les caractéristiques de performance opposées exactes (array.join vs + =) se sont avérées parfois vraies en JavaScript . Dans certains navigateurs, la concaténation de chaînes semble être optimisée automatiquement, et dans d'autres cas, elle ne l'est pas. Donc la recommandation (au moins dans cette question SO), est de simplement concaténer et de ne pas s'en inquiéter.
- Dans un autre cas, un compilateur Java peut remplacer automatiquement la concaténation par une construction plus efficace telle que StringBuilder. Cependant, comme d'autres l'ont souligné, cela est indéterministe, non garanti, et l'utilisation de StringBuilder ne nuit pas à la lisibilité. Dans ce cas particulier, j'ai tendance à déconseiller l'utilisation de la concaténation pour les grandes collections ou le recours à un comportement de compilateur Java indéterministe. De même, dans .NET, aucune optimisation du tri n'est jamais effectuée.
Ce n'est pas exactement un péché cardinal de ne pas connaître immédiatement toutes les nuances de chaque plate-forme, mais ignorer des problèmes de plate-forme importants comme celui-ci reviendrait presque à passer de Java à C ++ et à ne pas se soucier de désallouer la mémoire.