Avatar billede winkill Nybegynder
11. maj 2000 - 15:42 Der 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...??

Håber ikke at ? blev alt for kryptisk.
Avatar billede tdaugaard Nybegynder
11. maj 2000 - 16:04 #1
Jeg tror du ville vække folks interesse en lille bitte smuler mere hvis du gav mere end 0 point.
Avatar billede winkill Nybegynder
11. maj 2000 - 16:05 #2
Ups...
Avatar billede 127144146281 Nybegynder
11. maj 2000 - 17:14 #3
kan ikke lige huske om Join er med i den nyeste udgave af vb, men ellers vil jeg tro den vil klare dit prob hurtigst
Avatar billede winkill Nybegynder
11. maj 2000 - 17:23 #4
Ok, ind til videre ser det jo godt ud, men jeg vil lige se det virke i praksis når jeg kommer hjem...
Avatar billede winkill Nybegynder
12. maj 2000 - 09:41 #5
Hmmm, hvad nu hvis det ikke er et Array, men en lang række strings som jeg vil samle ?
Avatar billede 127144146281 Nybegynder
12. maj 2000 - 19:18 #6
så kan jeg ikke lige komme på nogle andre idéer end det du selv har skrevet
Avatar billede winkill Nybegynder
12. maj 2000 - 20:00 #7
Hmmm... nå, men nogen skal jo have pointene så hvad med at du opretter en svar... Du har trods alt svaret på den ene halvdel af ?'et.
Avatar billede 127144146281 Nybegynder
12. maj 2000 - 20:11 #8
ok, men du kan da bare snuppe dem igen, jeg er egentlig ligeglad, det er tanken der tæller
Avatar billede philiph Nybegynder
13. maj 2000 - 03:23 #9
Øøøøjeblik, der er en anden løsning.

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!

En hurtig benchmark siger:

Elementer Skrammel1 Skrammel2
1000      0,175 sek 0,006 sek
4000      7,0 sek  0,02 sek   

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
Avatar billede winkill Nybegynder
14. maj 2000 - 14:10 #10
Tak, så fik jeg reduceret tiden som min kode tager for at rette et par tusinde dukumenter med over 30 sekunder...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester