Sua explicação sobre por que é ineficiente é precisa, pelo menos nas linguagens que eu conheço (C, Java, C #), embora eu discorde que é universalmente comum executar grandes quantidades de concatenação de cadeias. No código C # eu trabalho, há o uso abundante de StringBuilder
, String.Format
etc., que são todos de memória salvar techiniques para evitar o excesso de realocação.
Portanto, para chegar à resposta da sua pergunta, precisamos fazer outra pergunta: se nunca é realmente um problema concatenar strings, por que as classes gostam StringBuilder
e StringBuffer
existem ? Por que o uso de tais aulas está incluído em livros e aulas de programação semi-iniciantes? Por que conselhos de otimização aparentemente pré-maduros seriam tão proeminentes?
Se a maioria dos desenvolvedores de concatenação de strings baseasse sua resposta puramente na experiência, a maioria diria que isso nunca faz diferença e evitaria o uso de tais ferramentas em favor do "mais legível" for (int i=0; i<1000; i++) { strA += strB; }
. Mas eles nunca mediram isso.
A resposta real para essa pergunta pode ser encontrada nesta resposta do SO , que revela que, em um caso, ao concatenar 50.000 seqüências de caracteres (que, dependendo do aplicativo, podem ser uma ocorrência comum), mesmo pequenas, resultaram em um desempenho de 1000x .
Se o desempenho literalmente não significa nada, concatenar. Mas eu discordo que o uso de alternativas (StringBuilder) é difícil ou menos legível e, portanto, seria uma prática de programação razoável que não deve invocar a defesa de "otimização prematura".
ATUALIZAR:
Acho que isso se resume a conhecer sua plataforma e seguir suas melhores práticas, que infelizmente não são universais . Dois exemplos de duas "línguas modernas" diferentes:
- Em outra resposta do SO , as características exatas de desempenho opostas (array.join vs + =) foram algumas vezes verdadeiras no JavaScript . Em alguns navegadores, a concatenação de strings parece ser otimizada automaticamente e, em outros casos, não é. Portanto, a recomendação (pelo menos nessa pergunta do SO) é apenas concatenar e não se preocupar com isso.
- Em outro caso, um compilador Java pode substituir automaticamente a concatenação por uma construção mais eficiente, como StringBuilder. No entanto, como outros salientaram, isso é indeterminista, não garantido, e o uso do StringBuilder não prejudica a legibilidade. Nesse caso em particular, eu recomendaria não usar a concatenação para grandes coleções ou confiar em um comportamento indeterminista do compilador Java. Da mesma forma, no .NET, nenhuma otimização da classificação é executada .
Não é exatamente um pecado fundamental não conhecer todas as nuances de todas as plataformas imediatamente, mas ignorar questões importantes da plataforma como essa seria quase como mudar de Java para C ++ e não se importar com a desalocação de memória.