Ihre Erklärung, warum es ineffizient ist, ist korrekt, zumindest in den Sprachen, mit denen ich vertraut bin (C, Java, C #), obwohl ich nicht zustimmen würde, dass es allgemein üblich ist, massive Mengen an String-Verkettung durchzuführen. In dem C # -Code, an dem ich arbeite StringBuilder
, String.Format
wird häufig usw. verwendet. Dies sind alles speichersparende Techniken, um eine Überzuweisung zu vermeiden.
Um zur Antwort auf Ihre Frage zu gelangen, müssen wir eine andere Frage stellen: Wenn es nie wirklich ein Problem ist, Zeichenfolgen zu verketten, warum möchten StringBuilder
und StringBuffer
existieren Klassen ? Warum ist die Verwendung solcher Klassen auch in Programmierbüchern und -klassen für Anfänger enthalten? Warum sollten scheinbar ausgereifte Optimierungsratschläge so wichtig sein?
Wenn die meisten Entwickler, die Zeichenfolgen verketten, ihre Antwort nur auf Erfahrung stützen würden, würden die meisten sagen, dass dies niemals einen Unterschied macht, und würden die Verwendung solcher Tools zugunsten der "besser lesbaren" vermeiden for (int i=0; i<1000; i++) { strA += strB; }
. Aber sie haben es nie gemessen.
Die eigentliche Antwort auf diese Frage findet sich in dieser SO-Antwort , aus der hervorgeht, dass in einem Fall beim Verketten von 50.000 Zeichenfolgen (die je nach Anwendung häufig vorkommen) selbst kleine Zeichenfolgen zu einem 1000- fachen Leistungseinbruch führten .
Wenn Leistung buchstäblich überhaupt nichts bedeutet, verketten Sie sie auf jeden Fall. Aber ich würde nicht zustimmen , dass Alternativen (String) schwierig oder weniger lesbar mit , und daher wäre eine vernünftige Vorgehensweise zu programmieren sein , dass sollte nicht um die „vorzeitige Optimierung“ Verteidigung.
AKTUALISIEREN:
Ich denke, es kommt darauf an, Ihre Plattform zu kennen und ihre Best Practices zu befolgen, die leider nicht universell sind . Zwei Beispiele aus zwei verschiedenen "modernen Sprachen":
- In einer anderen SO-Antwort wurde festgestellt, dass die genau entgegengesetzten Leistungsmerkmale (array.join vs + =) in JavaScript manchmal zutreffen . In einigen Browsern scheint die Verkettung von Zeichenfolgen automatisch optimiert zu werden, in anderen Fällen jedoch nicht. Die Empfehlung (zumindest in dieser SO-Frage) lautet also, nur zu verketten und sich keine Sorgen zu machen.
- In einem anderen Fall ein Java - Compiler kann automatisch Verkettung mit einem effizienteren Konstrukt wie String ersetzen. Wie andere bereits betont haben, ist dies jedoch unbestimmt, nicht garantiert, und die Verwendung von StringBuilder beeinträchtigt die Lesbarkeit nicht. In diesem speziellen Fall würde ich eher davon abraten, die Verkettung für große Sammlungen zu verwenden oder mich auf ein unbestimmtes Verhalten des Java-Compilers zu verlassen. In ähnlicher Weise wird in .NET niemals eine Optimierung der Sortierung durchgeführt .
Es ist nicht gerade eine Hauptsünde, nicht jede Nuance jeder Plattform sofort zu kennen, aber wichtige Plattformprobleme wie diese zu ignorieren, wäre fast so, als würde man von Java zu C ++ wechseln und sich nicht um die Freigabe von Speicher kümmern.