La tua spiegazione del perché è inefficiente è accurata, almeno nelle lingue che conosco (C, Java, C #), anche se non sarei d'accordo sul fatto che è universalmente comune eseguire massicce quantità di concatenazione di stringhe. Nel codice C # su cui lavoro, c'è un uso copioso di StringBuilder
, String.Format
, ecc. Che sono tutte tecniche di salvataggio della memoria per evitare una sovra-riallocazione.
Quindi per ottenere la risposta alla tua domanda, dobbiamo fare un'altra domanda: se non è mai veramente un problema concatenare le stringhe, perché esistono classi come StringBuilder
e StringBuffer
? Perché l'uso di tali classi è incluso anche nei libri e nelle classi di programmazione semi-principianti? Perché i consigli di ottimizzazione apparentemente prematuri sono così importanti?
Se la maggior parte degli sviluppatori che concatenano le stringhe basano la loro risposta esclusivamente sull'esperienza, la maggior parte direbbe che non fa mai la differenza e eviterebbe l'uso di tali strumenti a favore del "% più leggibile" for (int i=0; i<1000; i++) { strA += strB; }
. Ma non l'hanno mai misurato.
La vera risposta a questa domanda si può trovare in questa risposta SO , che rivela che in un caso, quando si concatena 50.000 stringhe (che a seconda dell'applicazione potrebbero essere un evento comune), anche di piccole dimensioni, hanno prodotto un risultato di prestazioni 1000 volte .
Se le prestazioni letteralmente non significano nulla, significa assolutamente concatenare. Ma non sarei d'accordo sul fatto che l'utilizzo di alternative (StringBuilder) sia difficile o meno leggibile , e quindi sarebbe una pratica di programmazione ragionevole che non dovrebbe invocare la difesa "ottimizzazione prematura".
UPDATE:
Penso che ciò che ne consegue, è conoscere la tua piattaforma e seguire le sue migliori pratiche, che purtroppo non sono universali . Due esempi da due diverse "lingue moderne":
- In un'altra risposta SO , le caratteristiche di rendimento esatto opposto (array.join vs + =) sono stati trovati a volte true in JavaScript . In alcuni browser, la concatenazione delle stringhe sembra essere ottimizzata automaticamente, e in altri casi non lo è. Quindi la raccomandazione (almeno in quella domanda SO), è solo concatenare e non preoccuparsene.
- In un altro caso, un compilatore Java può sostituire automaticamente la concatenazione con un costrutto più efficiente come StringBuilder. Tuttavia, come altri hanno sottolineato, questo è indeterministico, non garantito, e l'uso di StringBuilder non pregiudica la leggibilità. In questo caso particolare, tenderei a raccomandare l'uso della concatenazione per grandi raccolte o basarsi su un comportamento indeterministico del compilatore Java. Allo stesso modo, in .NET, non viene eseguita alcuna ottimizzazione del tipo , mai.
Non è esattamente un peccato capitale non sapere tutte le sfumature di ogni piattaforma subito, ma ignorare importanti problemi di piattaforma come questo sarebbe quasi come passare da Java a C ++ e non preoccuparsi di deallocare la memoria.