Zur Aufgabe / zum Problem: Natürlich geht das in VB ganz einfach: Gesamtstring = Gesamtstring & Datenpaket Bei etwas grösseren String, so im MB Bereich, dauerte das Ganze aber schier "unendlich" lange, so dass trotz eines 100 MBit lokalen Netzwerks kaum mehr ISDN Geschwindigkeit herauskommt. Um die Stringverkettung zu optimieren, war der erste Gedanke: RTLMoveMemory-Funktion aus dem Windows API. Doch dann bin ich auf eine recht simple und mit reinen VB-Mitteln realisierbare Variante gestossen, die bei grossen Strings locker um den Faktor 1000 und mehr schneller ist. Herausgekommen ist folgendes Klassenmodul: Option Explicit ' private Variablen Private sCollect As String Private nLen As Long Private sTemp As String Private Sub Class_Initialize() ' Sammelstring vor-initialisieren Reset End Sub Public Sub Reset() sCollect = String$(100, " ") nLen = 0 End Sub Public Property Get Result() As String ' korrekter Rückgabe-String Result = Left$(sCollect, nLen) End Property Public Sub Add(sString As String) If Len(sString) + nLen > Len(sCollect) Then ' Es ist wichtig für die Performance, dass der String ' immer verdoppelt wird, da ansonsten zu oft ' neuer Speicherplatz angefordert würde, was die ' Performance wiederrum zunichte macht sTemp = Left$(sCollect, nLen) sCollect = String$(2 * Len(sCollect) + Len(sString), " ") Mid$(sCollect, 1, nLen) = sTemp sTemp = "" ' damit der Speicher wieder frei wird ! End If Mid$(sCollect, nLen + 1, Len(sString)) = sString nLen = nLen + Len(sString) End Sub Das Prinzip: Ein kleines Beispielprojekt: Option Explicit Dim sAlphabet As String Private Sub Form_Load() Dim i As Long sAlphabet = "" For i = 65 To 90 sAlphabet = sAlphabet & Chr$(i) Next End Sub Private Sub Command1_Click() Dim nTime As Single Dim sResult As String Dim i As Long nTime = Timer ' ------------------------------------------------------------ ' Simpel: Die Aufgabe lösen, indem an den späteren Zielstring ' immer wieder der gewünschte String angehängt wird ... For i = 1 To 10000 sResult = sResult & sAlphabet Next i MsgBox "Benötigte Zeit: " & _ Format$(Int((Timer - nTime) * 1000), "#,###,##0 ms") End Sub Private Sub Command2_Click() Dim nTime As Single Dim sResult As String Dim i As Long nTime = Timer ' ------------------------------------------------------------ ' die bessere Variante: Erst den Speicherplatz reservieren ' und dann gezielt den String einbauen Dim oClass As New Class1 For i = 1 To 10000 oClass.Add sAlphabet Next i MsgBox "Benötigte Zeit: " & _ Format$(Int((Timer - nTime) * 1000), "#,###,##0 ms") End Sub Das Ergebnis: Es kommt aber noch dicker: Verdoppeln Sie einmal den Durchlaufwert von 10000 auf 20000. Hier braucht die erste Variante dann schon sage und schreibe 16034 ms. Die zweite Variante hingegen erledigte die gleiche Aufgabe in hervorragenden 31 ms!!! Dieser Tipp wurde bereits 17.122 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. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. 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 sevGraph (VB/VBA) Grafische Auswertungen Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! |
||||||||||||||||
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. |