In VB.Net sind Zeichenketten unveränderlich. Das heisst, bei jeder String-Operation, die eine Zeichenkette verändert, wird die alte Zeichenkette verworfen und eine neue erzeugt. Das wäre keine Problem, würde die alte Zeichenkette sich nicht mehr im Speicher befinden. Jedoch passiert das erst nach einer Weile. Der daraus resultierende Code ist geradezu unlaublich langsam. Beispiel: Innerhalb einer Schleife wird eine Zeichenkette erweitert: Dim Str as String Dim i as Integer For i = 1 to 10000 Str += "Zeile " & i & vbcrlf Next i Hier wird pro Durchgang eine neue Zeichenkette angelegt. Das sind 10000, wovon 9999 wieder freigegeben werden müssen. Hinzu kommt noch, dass bei jedem Schleifendurchlauf die alte Zeichenkette in die neue kopiert werden muss. Abhilfe schaft hier die StringBuilder-Klasse. Die Text.StringBuider-Klasse ermöglicht es Zeichenketten zusammenzusetzen, wobei versucht wird die Zeichenkette am selben Ort im Speicher zu belassen. Leider stehen in dieser Klasse nur sehr wenige Methoden zur Verfügung: Dim str as New System.Text.StringBuilder ' hängt einen Text an einen String an str.Append ("Text") ' fügt Text an eine bestimmte Position ein str.Insert (5,"Text") ' löscht einen Text str.Remove(2,3) ' ersetzt einen Text str.Replace ("Text","Text2") Dass sich der Einsatz der StringBuilder-Klasse wirklich lohnt zeigt das folgende Beispiel. Es durchläuft 5000 mal eine Schleife und berechnet anschließend die benötigte Zeit. Benötigt werden: 1 Form Und hier der Code: Const loopsize As Integer = 5000 Dim str As String Dim starttime As Date Dim totaltime As TimeSpan Private Function WithStrBuilder() As String Dim strB As New System.Text.StringBuilder() Dim strLine As String Dim i As Integer For i = 1 To loopsize strLine = "1/i = " & 1 / i & vbCrLf strB.Append(strLine) Next i Return strB.ToString End Function Private Function WithoutStrBuilder() As String Dim strT As String Dim i As Integer For i = 1 To loopsize strT += "1/i = " & 1 / i & vbCrLf Next i Return strT End Function Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click starttime = Now str = WithStrBuilder() TextBox2.Text = str totaltime = Now.Subtract(starttime) Label2.Text = (Format(totaltime.TotalSeconds, _ "Zeit: #.##### Sekunden")) End Sub Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click starttime = Now str = WithoutStrBuilder() TextBox1.Text = str totaltime = Now.Subtract(starttime) Label1.Text = (Format(totaltime.TotalSeconds, _ "Zeit: #.##### Sekunden")) End Sub Wenn Sie das Beispiel jetzt starten, sehen Sie es ganz deutlich: Der Einsatz der StringBuilder-Klasse ist in etwa 500 mal schneller gegenüber dem herkömlichen Code! Dieser Tipp wurde bereits 22.941 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevWizard für VB5/6 Professionelle Assistenten im Handumdrehen Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |