Ich lese ein Buch namens .NET Gotchas (lohnt sich ein Lesen IMO), die die Leistungsunterschiede zwischen String und StringBuilder veranschaulicht, und es ergab sich eine Frage, die ich Filz konnte nicht unbeantwortet bleiben! Obwohl ich die Interna beider Klassen nicht kenne (ohne die reflektierten Versionen dieser Klassen zu betrachten), habe ich mich gewundert; Da die Operatoren in .NET überladbar sind, hat Microsoft die String-Klasse nicht implementiert, um StringBuilder intern zu verwenden und die Verkettungsoperatoren zu überladen, um .Append() in StringBuilder einfach aufzurufen. Ich vermute, es gibt einige Gründe, warum dies nicht der Fall ist, und wenn ja, warum?.NET String Verkettung (+ & + =) vs. StringBuilder
Antwort
Das Problem ist nicht so sehr, dass String-Verkettung ist langsam, es ist mehr, dass wiederholte Verkettung erstellt eine Menge von Zwischen-Strings, die zugeordnet werden müssen und später Müll gesammelt.
EDIT
Beachten Sie, dass mystring += "a"
nicht einfach add "a" zum vorherigen String. Er erstellt eine neue Zeichenfolge für die Kombination und verweist darauf "mystring", wodurch der vorherige Wert verworfen wird (wenn keine Referenzen mehr vorhanden sind).
END EDIT
Eine Reihe von
string mystring = "something";
mystring += "something else";
mystring = mystring + "third";
langsamer ausführen, wenn Sie jede einzelne Zeile als String Anfügen von einem .ToString gefolgt tun() das Ergebnis zurück in einen String zu erhalten. Sie erhalten nur dann einen Leistungsvorteil, wenn Sie einen einzelnen StringBuilder, Append() mehrmals verwenden und am Ende einen .ToString() ausführen.
StringBuilder sb = new StringBuilder();
sb.Append("something");
sb.Append("something else");
sb.Append("third");
string mystring = sb.ToString();
Und dann ein Stringbuilder hat einen eigenen Aufwand ist so, dass es Sie nicht davon profitieren, wenn Sie eine kleine Anzahl von String-Teile zu verbinden.
Beachten Sie, dass der Compiler eine Verkettung in einer einzigen Anweisung optimiert weg:
string mystring = "something" + "something else" + "third";
ist am schnellsten.
Der Grund ist einfach:
weil
string result = a + b;
effizienter als
istvar sb = new StringBuilder(a, a.Length + b.Length);
sb.Append(b);
string result = sb.ToString();
StringBuilder
s nur dann Sinn machen, wenn viele Verkettungen passiert sind, in der Regel innerhalb einer Schleife.
- 1. Verwendet StringBuilder mehr Speicher als String-Verkettung?
- 2. String-Verkettung VS-String-Format
- 3. Warum StringBuilder explizit verwenden, wenn der Compiler die String-Verkettung automatisch in einen StringBuilder konvertiert?
- 4. StringBuilder vs XmlTextWriter
- 5. .NET StringBuilder und wörtliche Zeichenfolge Literal
- 6. String.join() vs andere String-Verkettung Operationen
- 7. String Verkettung vs Array implodieren in PHP
- 8. vs String in .NET
- 9. Streamwriter vs StringBuilder
- 10. Effiziente String-Verkettung in Scala
- 11. String Verkettung
- 12. String-Verkettung mit String()
- 13. String-Vergleich in .Net: "+" vs "-"
- 14. String.format() vs Zeichenfolge Verkettung Leistung
- 15. StringBuffer/StringBuilder durch String ersetzen
- 16. Iteration vs Liste Verkettung
- 17. StringBuilder in Flex
- 18. String-Verkettung oder HtmlGenericControl HTML-Steuerelemente?
- 19. Java: String concat vs StringBuilder - optimiert, also was soll ich tun?
- 20. .NET StringBuilder - prüfen, ob endet mit Zeichenfolge
- 21. JSP EL String Verkettung
- 22. String Verkettung mit Null
- 23. String-Verkettung mit Leerzeichen
- 24. Java String-Verkettung - nulls
- 25. Varianten der String-Verkettung?
- 26. String Verkettung in Jinja
- 27. String Verkettung Abfragen
- 28. String-Verkettung mit Konstanten
- 29. String Verkettung in Solidität?
- 30. Geschwindigkeit Unterschied für einzelne Zeile String Verkettung