Gå til innhold

Optimalisering av stadig voksende string


Anbefalte innlegg

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
Videoannonse
Annonse

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-allocation

Private 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 av aadnk
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...