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.088 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 März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Neu! sevCoolbar 3.0 Professionelle Toolbars im modernen Design! Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access |
||||||||||||||||
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. |