Rubrik: Variablen/Strings | VB-Versionen: VB.NET | 20.06.08 |
Effiziente String-Operationen durch StringBuilder-Klasse Durch Verwendung der Stringbuilder-Klasse statt String-Variablen sind in vielen Fällen ERHEBLICHE Effizienzgewinne möglich | ||
Autor: Manfred Bohn | Bewertung: | Views: 14.636 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Wenn man eine Zeichenfolge aus einer größeren Serie von Teilstrings zusammensetzt, ist es nicht besonders effizient, das in einer Schleife durch den &-Operator zu erledigen.
Dim s As String Dim text As String text = "abcdef" Dim i, N As Integer N = 30000 For i = 1 To N s = s & "abcdef" Next i
Dieser Vorgang benötigt mehrere Sekunden Rechenzeit.
Nun könnte man auf die Idee kommen, dem Zielstring einen geeignet großen Buffer zuzuweisen und die Teilstrings einzufügen - z.B. so:
Dim se As String se = Space(N * Len(text)) For i = 1 To N Mid(se, (i - 1) * Len(text) + 1) = text Next i
Diese Idee ist allerdings schlecht. Für diese Operationen wird in den meisten Fällen sogar noch deutlich mehr Rechenzeit benötigt.
Das liegt daran, dass die Zeichenfolgen in String-Variablen 'unveränderlich' sind. Jeder Vorgang (auch das Einfügen oder Überschreiben), der die Zeichenfolge verändert, erfordert die Allokation von Speicher und die Kopie der gesamten Zeichenfolge.
Man sollte deshalb in solchen Fällen auf die StringBuilder-Klasse ausweichen.
Dim sb As New System.Text.StringBuilder(N * Len(text)) For i = 1 To N sb.Append(text) Next i se = sb.ToString
Der Effizienzgewinn kann 'immens' sein.
Hinweis für VB6-Umsteiger:
Wenn Sie sich jetzt wundern, liegen Sie richtig. In VB6 war es sehr effizient, String-Variablen zunächst einen genügend großen Speicherbereich zuzuweisen.
In VB.Net ist dieses Verfahren sogar noch erheblich ineffizienter, als die Verwendung des &-Operators in Schleifen. Aus VB6 umgestellter Code sollte deshalb durch Verwendung der StringBuilder-Klasse angepasst werden.
Der Upgrade-Assistent weist NICHT auf das geänderte Verhalten der String-Variablen hin.