Degeim Skrevet 6. september 2005 Del Skrevet 6. september 2005 Når det 10 000 (titusen) ganger blir lagt til 4 (fire) tegn i en string tar denne prosessen lengre og lengre tid etterhvert som stringen vokser. For eksempel tok det et minutt fra 0 til 20 000 tegn, men 2 minutt og 20 sekund videre fra 20 000 til 40 000. Kan dette optimaliseres på noen måte? Koden jeg bruker nå er følgende: string=string & "abcd" Takk. Lenke til kommentar
aadnk Skrevet 6. september 2005 Del Skrevet 6. september 2005 (endret) Problematikken er knyttet til det faktum at Visual Basic reallokerer hele strengen på nytt hver eneste gang du kaller den linjen. For å unngå dette, kan vi bruke en egen allokeringsprosedyre som kun allokerer en ny streng etter et visst antall byte, såsom følgende (legg koden i en klassemodul med navn clsString): ' Faster string-allocationPrivate Declare Function SysAllocStringByteLen Lib "oleaut32" (ByVal olestr&, ByVal BLen As Long) As String ' Internal variables Private sBuffer As String Private lngSegmentSize As Long Private lngCurrPos As Long Private lngActual As Long Private Sub Class_Initialize() ' Set default values lngSegmentSize = 128 lngCurrPos = 1 ' Start with the default lenght lngActual = lngSegmentSize ' Preallocate the string AllocateString End Sub Private Sub AllocateString() ' Reallocate the string sBuffer = SysAllocStringByteLen(0&, lngActual) End Sub Public Sub AppendString(sString As String) Dim sTemp As String ' Firstly, see if a reallocating is needed If lngCurrPos + Len(sString) - 1 > lngActual Then ' Save the content of the string sTemp = ToString ' Increase by one segment lngActual = lngActual + lngSegmentSize ' Increse the size of the next segment lngSegmentSize = lngSegmentSize * 8 ' Create a new buffer AllocateString ' Then set the newly created buffer Mid(sBuffer, 1, Len(sTemp)) = sTemp End If ' Insert string in the correct position Mid(sBuffer, lngCurrPos, Len(sString)) = sString ' Increase the write-position lngCurrPos = lngCurrPos + Len(sString) End Sub Public Property Get ToString() As String ' Retrive the string ToString = Mid(sBuffer, 1, lngCurrPos - 1) End Property Public Property Get Lenght() As String ' Retrives the lenght of the string Lenght = lngCurrPos End Property For å lage en streng med denne klassen, kan du gjøre således: Dim cString As New clsString, Tell As Long ' Legg til en streng titusen ganger For Tell = 1 To 10000 cString.AppendString "abcd" Next ' Returner streng txtTest.Text = cString.ToString Når jeg målte tiden det tok å legge til en firekarakterstreng titusen ganger (tiden det tok å legge teksten i tekstboksen var ikke medberegnet), fikk jeg 7,66 ms. Dernest brukte prosedyren 43,73 ms på 200 000 tegn totalt. Èn million tegn tok 255,34 ms. Edit: Hr. Leif kommer alltid på slike ubeleilige tider. Huff. Endret 6. september 2005 av aadnk Lenke til kommentar
Steinmann Skrevet 6. september 2005 Del Skrevet 6. september 2005 Det vil også gå raskere om du lagrer den som en byte array Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå