Su explicación de por qué es ineficiente es precisa, al menos en los lenguajes con los que estoy familiarizado (C, Java, C #), aunque no estoy de acuerdo con que sea universalmente común realizar cantidades masivas de concatenación de cadenas. En el código C # Yo trabajo en adelante, no es el uso abundante de StringBuilder, String.Format, etc., que son el ahorro de toda la memoria techiniques a evitar el exceso de reasignación.
Entonces, para obtener la respuesta a su pregunta, debemos hacer otra pregunta: si nunca es realmente un problema concatenar cadenas, ¿por qué las clases les gustaría StringBuildery StringBufferexistirían ? ¿Por qué se incluye el uso de tales clases incluso en libros y clases de programación para principiantes? ¿Por qué los consejos de optimización aparentemente maduros serían tan importantes?
Si la mayoría de los desarrolladores de concatenación de cadenas basasen su respuesta únicamente en la experiencia, la mayoría diría que nunca hace la diferencia y rechazaría el uso de tales herramientas en favor de las "más legibles" for (int i=0; i<1000; i++) { strA += strB; }. Pero nunca lo midieron.
La respuesta real a esta pregunta se puede encontrar en esta respuesta SO , que revela que en una instancia, al concatenar 50,000 cadenas (que dependiendo de su aplicación, puede ser una ocurrencia común), incluso las pequeñas, resultaron en un rendimiento de 1000x .
Si el rendimiento literalmente no significa nada en absoluto, se concatena. Pero no estoy de acuerdo con que usar alternativas (StringBuilder) sea difícil o menos legible , y por lo tanto sería una práctica de programación razonable que no debería invocar la defensa de "optimización prematura".
ACTUALIZAR:
Creo que esto se reduce a conocer su plataforma y seguir sus mejores prácticas, que lamentablemente no son universales . Dos ejemplos de dos "idiomas modernos" diferentes:
- En otra respuesta SO , se encontró que las características de rendimiento opuestas exactas (array.join vs + =) a veces eran ciertas en JavaScript . En algunos navegadores, la concatenación de cadenas parece estar optimizada automáticamente, y en otros casos no lo está. Entonces, la recomendación (al menos en esa pregunta SO), es concatenar y no preocuparse por eso.
- En otro caso, un compilador de Java puede reemplazar automáticamente la concatenación con una construcción más eficiente como StringBuilder. Sin embargo, como otros han señalado, esto es indeterminado, no está garantizado, y usar StringBuilder no perjudica la legibilidad. En este caso particular, tendería a recomendar el uso de la concatenación para grandes colecciones o confiar en un comportamiento indeterminado del compilador de Java. Del mismo modo, en .NET, nunca se realiza una optimización del tipo .
No es exactamente un pecado capital no conocer todos los matices de cada plataforma de inmediato, pero ignorar problemas importantes de la plataforma como este sería casi como pasar de Java a C ++ y no preocuparse por desasignar la memoria.