11. maj 2000 - 15:42Der er
9 kommentarer og 1 løsning
Strings - Den hurtigste måde...
Ok, jeg har x antal strings i et array som jeg gerne vil samle i en enkelt string. Hvordan gøres dette med mindst mulig belastning for systemet?
En måde er Sub SammelDetSkrammel(ByRef Result As String,ByVal TheArray() As String) Dim temp For Each tmp In TheArray Result = Result & tmp Next tmp End Sub
men ovenstående er alt for langsomt da det indebærer at indholdet af Result læses og lægges sammen med tmp lige så mange gange som der er indhold i TheArray.
Er der ikke en anden måde at lægge to strings sammen hvor man undgår at første string bliver lagt sammen med den anden og først derefter bliver gemt i den første string...??
Det som tager tid er reserveringen af plads til strengen, som er noget VB/VBA/VBScript ikke er særlige effektive til. Derfor er det en mulighed at reservere pladsen til strengen en gang for alle, og så indsætte dataene i strengen:
Function SammelDetSkrammel2(TheArray() As String) As String Dim i As Long Dim CalcLen As Long Dim Pos As Long Dim Result As String
’*** Gennemløb alle array entrys og beregn samlet længde *** For i = LBound(TheArray, 1) To UBound(TheArray, 1) CalcLen = CalcLen + Len(TheArray(i)) Next i
’*** Reserver plads *** Result = Space(CalcLen)
’Indsæt strenge i reserveret plads *** Pos = 1 For i = LBound(TheArray, 1) To UBound(TheArray, 1) If Len(TheArray(i)) > 0 Then Mid$(Result, Pos, Len(TheArray(i))) = TheArray(i) Pos = Pos + Len(TheArray(i)) End If Next i
SammelDetSkrammel2 = Result End Function
- Der er flere optimerings tricks i rutinen: Brug af for each tager en ekstra kopi af hvert element hvilket elimineres ved brug af en numerisk loop variabel. - Alle variable er deklareret med den ”billigste” type. Hvis ingen type angives giver det som default en variant, som er en af de tungeste variabletyper, set fra systemets side.
Nåh ja, så er jeg kommet til at lave det til en funktion. Overførsel af variabler der ændres af funktionen/Sub’en er noget SNAVS!
Ved 10000 elementer sker der et eller andet, så Skrammel1 rutinen er flere minutter om at svare, men det tyder på at min version performer lineært med antallet af elementer, hvorimod original rutinen performer dobbelt eller tribbelt eksponentielt.
Under 100 elementer er forskellen så lille, så man måske ikke kan forsvare den extra kode.
Hvad så? Var det et svar der ville noget eller hvad? Philip
Tak, så fik jeg reduceret tiden som min kode tager for at rette et par tusinde dukumenter med over 30 sekunder...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.