La tua spiegazione del perché sia inefficiente è accurata, almeno nelle lingue che conosco (C, Java, C #), anche se non sarei d'accordo sul fatto che sia universalmente comune eseguire enormi quantità di concatenazione di stringhe. Nel codice C # io lavoro su, non v'è l'uso abbondante di StringBuilder
, String.Format
ecc che sono tutti di risparmio techiniques per evitare un eccesso di riallocazione della memoria.
Quindi, per arrivare alla risposta alla tua domanda, dobbiamo porre un'altra domanda: se non è mai davvero un problema concatenare le stringhe, perché le classi dovrebbero piacere StringBuilder
ed StringBuffer
esistere ? Perché l'uso di tali classi è incluso anche nei libri e nelle classi di programmazione per principianti? Perché i consigli di ottimizzazione apparentemente pre-maturi dovrebbero essere così importanti?
Se la maggior parte degli sviluppatori concatenatori di stringhe dovesse basare la propria 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 potrebbe essere trovata in questa risposta SO , che rivela che in un caso, quando si concatenano 50.000 stringhe (che a seconda della propria applicazione, può essere un evento comune), anche di piccole dimensioni, si ottiene un impatto sulle prestazioni 1000x .
Se le prestazioni letteralmente non significano nulla, concatenate sicuramente. Ma non sarei d'accordo sul fatto che l'uso di alternative (StringBuilder) sia difficile o meno leggibile , e quindi sarebbe una pratica pratica di programmazione che non dovrebbe invocare la difesa "ottimizzazione prematura".
AGGIORNARE:
Penso che ciò accada, è 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 esatte caratteristiche di prestazione opposte (array.join vs + =) sono risultate talvolta vere in JavaScript . In alcuni browser, la concatenazione di 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'utilizzo di StringBuilder non danneggia la leggibilità. In questo caso particolare, tenderei a sconsigliare l'uso della concatenazione per raccolte di grandi dimensioni o fare affidamento su un comportamento del compilatore Java indeterministico. Allo stesso modo, in .NET, nessuna ottimizzazione dell'ordinamento viene mai eseguita .
Non è esattamente un peccato cardinale non conoscere subito ogni sfumatura di ogni piattaforma, ma ignorare importanti problemi di piattaforma come questo sarebbe quasi come passare da Java a C ++ e non preoccuparsi di deallocare memoria.