Unterschied StringBuilder.Append und Neuzuweisung
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.
-
-
Der StringBuilder ist deutlich (!) schneller beim verketten großer Texte."Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."
Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
Wie man VisualStudio nutzt? => VisualStudio richtig nutzen -
@Haudruferzappeltnoch Der StringBuilder ist für das Verketten von Strings gemacht.
Das Resultat beider Operationen bei Dir ist dasselbe, und den Geschwindigkeitsvorteil bekommst Du, wenn das oft genug aufgerufen wird.
In Deinem Fall würde ich die String-Variante nehmen.
Bei mehr als sagen wir 5 Verkettungen nehme ich einen StringBuilder, das hängt natürlich auch vom Kontext ab.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
@Haudruferzappeltnoch Der ist genau dafür gemacht.
Strings können nicht in sich editiert werden, die erzeugen eine neue String-Instanz.
Der StringBuilder arbeitet auf einem (hinreichend) großen Speicher, und wenn der nicht reicht, vergrößert er ihn.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
Hab das neulich bei mir getestet mit einer Consolenanwendung:
5000 mal einen Text (je ca. 900 Zeichen) verketten:
StringBuilder: 0,0080853 Sekunden
String.Concat: 9,2904944 Sekunden
"Normal": 9,4564312 Sekunden"Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."
Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
Wie man VisualStudio nutzt? => VisualStudio richtig nutzen -
Kannst du den Code zeigen?
Es gibt noch weitere Möglichkeiten, Strings performant zu verketten.
Und es gibt ja auch unterschiedliche Problemstellungen.
Probleme gibts ja meist nur, wenn an denselben String immer mehr und mehr Strings angehängt werden sollen.
Grade da kann man mit einerList(Of STring)
, und dannString.Concat(myStringList)
ähnlich hervorragende Werte erzielen wie mit StringBuilder. -
ErfinderDesRades schrieb:
an denselben String immer mehr und mehr Strings angehängt werden"Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."
Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
Wie man VisualStudio nutzt? => VisualStudio richtig nutzen -
Danke euch.
PS:
Hierfür benutze ich es momentan ("abc" ist nicht unbedingt dasselbe)
Spoiler anzeigen VB.NET-Quellcode
- Dim Druck as StringBuilder
- Druck.Append("abc")
- Druck.Append("abc")
- Druck.Append(arrDruckdaten(7))
- Druck.Append("abc")
- Druck.Append(arrDruckdaten(4))
- Druck.Append("abc")
- If arrDruckdaten(2).Length > 16 Then
- Druck.Append(arrDruckdaten(2).Substring(0, 16))
- Else
- Druck.Append(arrDruckdaten(2))
- End If
- Druck.Append("abc")
- If arrDruckdaten(3).Length > 16 Then
- Druck.Append(arrDruckdaten(3).Substring(0, 16))
- Else
- Druck.Append(arrDruckdaten(3))
- End If
- Druck.Append("abc")
- Druck.Append(arrDruckdaten(6))
- Druck.Append("abc")
- Druck.Append(arrDruckdaten(5))
- Druck.Append("abc")
- Druck.Append(arrDruckdaten(1))
- Druck.Append("abc")
- Druck.Append(arrDruckdaten(0))
- Druck.Append("abc")
- Druck.Replace("ß", "ss")
- Druck.Replace("ä", "ae")
- Druck.Replace("ö", "oe")
- Druck.Replace("ü", "ue")
- Druck.Replace(" 00:00:00", "")
- Druck.Replace("-", "")
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()
-
ErfinderDesRades schrieb:
Kannst du den Code zeigen?
Hier der Testcode.
Spoiler anzeigen
VB.NET-Quellcode
-
- Private Rows As Integer = 5000
- Sub Main()
- Console.WriteLine($"{Rows.ToString} Texte verketten:")
- WriteText()
- Console.ReadLine()
- End Sub
- Private Sub WriteText()
- AddString()
- BuildString()
- ConcatString()
- End Sub
- Private Sub AddString()
- Dim txt As String = ""
- Dim sw As New Stopwatch
- sw.Start()
- For i As Integer = 0 To Rows
- txt &= GetValues() & vbCrLf
- Next
- sw.Stop()
- Console.WriteLine("Normal: " & sw.Elapsed.TotalSeconds)
- End Sub
- Private Sub BuildString()
- Dim sb As New StringBuilder()
- Dim sw As New Stopwatch
- sw.Start()
- For i As Integer = 0 To Rows
- sb.Append(GetValues() & vbCrLf)
- Next
- sw.Stop()
- Console.WriteLine("StringBuilder:" & sw.Elapsed.TotalSeconds)
- End Sub
- Private Sub ConcatString()
- Dim txt As String = ""
- Dim sw As New Stopwatch
- sw.Start()
- For i As Integer = 0 To Rows
- txt = String.Concat(txt, GetValues() & vbCrLf)
- Next
- sw.Stop()
- Console.WriteLine("ConcatString: " & sw.Elapsed.TotalSeconds)
- End Sub
- Private Function GetValues() As String
- Return "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem"
- End Function
In meinem Hauptprojekt hat der Wechsel vom "normalen" String verketten (str &= "foo") zum StringBuilder eine Zeitersparnis von ~60 Sekunden gebracht. Der Code oben entsprich in etwa dem, was ich dort gemacht habe."Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."
Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
Wie man VisualStudio nutzt? => VisualStudio richtig nutzen -
@Haudruferzappeltnoch Das sieht doch ganz gut aus. Hast Du da fortlaufenden Text ohne Zeilenschaltung?
Vielleicht nur als Erinnerung:
StringBuilder.Append(...)
schreibt den Text unmittelbar hinter einander,
StringBuilder.AppendLine(...)
hängt eine neue Zeile an den bestehenden Text,
StringBuilder.AppendLine()
hängt eine Leerzeile an den bestehenden Text.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()
-
mrMo schrieb:
Hier der Testcode.VB.NET-Quellcode
- Private Sub WriteText()
- StringList()
- BuildString()
- End Sub
- Private Sub StringList()
- Dim sw = Stopwatch.StartNew
- Dim stringList = New List(Of String)
- For i As Integer = 0 To Rows
- stringList.Add(GetValues())
- Next
- Dim txt = String.Join(vbCrLf, stringList)
- Debug.WriteLine("StringList: " & sw.Elapsed.TotalSeconds)
- End Sub
- Private Sub BuildString()
- Dim sw = Stopwatch.StartNew
- Dim sb As New StringBuilder()
- For i As Integer = 0 To Rows
- sb.Append(GetValues() & vbCrLf)
- Next
- Dim txt = sb.ToString
- Debug.WriteLine("StringBuilder:" & sw.Elapsed.TotalSeconds)
- End Sub
Ausgabe:Aber das ist beides so schnell, dass es- egal ist
- Windows-ThreadOptimierung stark ins Ergebnis hineinspielt
Also je häufiger eine Methode aufgerufen wird, desto schneller wird sie.
Und der erste Benchmark ist immer merklich langsamer als folgende
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()
-
Es gibt diverse Artikel dazu, dieser hier ist auch interessant und führt deine Erläuterung weiter aus. Ein Artikel aus der Knowledgabse ist ebenfalls verlinkt.
Hier noch ein Benchmark, und noch einer. ein Thema das viele umtrieben hat.
Ein sehr interessanter Artikel ist auch der hier, der u.a. auch Stringbuilder behandelt.
Nicht davon beirren lassen, dass die Artikel meist von C# schreiben, es geht eh ums Framework, und das ist das selbe. -
-
Hmm - wirklich nützlich?
Weil Du hast doch jetzt schon zwei höchst performante Vorgehensweisen - das ist doch mehr als du brauchst.
Das einzige, was man sich merken muss, ist dass man nicht hunderte Male am selben String noch was hinten ranhängen sollte - vor allem nicht, wenn der String recht lang ist.
Weil Hinten dranhängen ist jedesmal ein Neu-Alloziieren von Speicher und dann Umkopieren.
Vermeiden kann man das mittm StringBuilder oder ich finde noch einfacher und mächtiger, mit einer List(Of String) - wo man den String nicht sukzessive zusammenbaut, sondern die Stückchen Stückchen sein lässt, bis alles fertig, und am Ende mit einem Befehl (String.Join oder String.Concat) verketten. -
-
Ich hatte vor einiger Zeit auch mal verschiedene Methoden des Strings-zusammenfügens gegeneinander getestet:
String verwenden oder gleich alles mit StringBuilder machen
-
Ähnliche Themen
-
oldrock - - Sonstige Problemstellungen
-
simon2581 - - Sonstige Problemstellungen
-
7 Benutzer haben hier geschrieben
- Haudruferzappeltnoch (8)
- mrMo (4)
- ErfinderDesRades (4)
- RodFromGermany (3)
- Dksksm (3)
- EaranMaleasi (2)
- Eierlein (1)