Avatar billede trer Nybegynder
03. marts 2006 - 23:49 Der er 9 kommentarer og
1 løsning

Behandling af to-dim. array

Hej

Jeg har et to-dimensionelt array som jeg skal behandle i VB Script - men et dobbelt loop gennem arrayet er frygtelig langsomt når mine dimensioner indeholder blot nogle tusinde elementer.

Hvordan optimerer jeg behandlingen - uden at benytte non-std COM objekter?

Nuværende algoritme:

Dim a,b,xdim,ydim,Matrix()
...
Redim Matrix(xdim,ydim)
a = 0
Do while a<=xdim
  b = 0
  do while b<=ydim
    ...
    x = Matrix (a,b)
    ...
    b = b + 1
  loop
  a = a + 1
loop
Avatar billede Slettet bruger
04. marts 2006 - 06:15 #1
Du kan starte med at gøre sådan her:

Dim a,b,xdim,ydim,Matrix()
...
Redim Matrix(xdim,ydim)
for a = 0 to xdim
    for b = 0 to ydim
        x = Matrix (a,b)
    next
next


Det flytter look check og indexer updating til fortolkeren istedet for dit program. Det er små ting men når det skal gøres mange gange.

Det kunne dog også tænkes at problemet findes  der hvor ... er i din kode ;)
Avatar billede trer Nybegynder
04. marts 2006 - 10:09 #2
Hmm - havde aldrig overvejet at en for next kunne være mere effektiv end et while-loop. Jeg prøver lige.

En tanke - det jeg reelt set skal er at samle hver række i matrix'en til en linje

altså
redim matrix(xdim,ydim)
for a = 0 to xdim
  for b = 0 to ydim
    x = x & matrix(a,b) & ","
  next
  x = x & vbCRLF
next
er der nogen måde at trække den ene dimension ud af arrayet på?

Og dermed ende med noget i stil med dette (som desværre ikke virker)

redim matrix(xdim,ydim)
for a = 0 to xdim
  x = x & join(matrix(a),",") & vbCRLF
next
Avatar billede trer Nybegynder
04. marts 2006 - 10:13 #3
Respekt!

Alene ændringen fra while loop til for next giver en målbar performance forbedring. Du kan roligt lægge et svar og få dine points.
Avatar billede erikjacobsen Ekspert
04. marts 2006 - 11:25 #4
VBScript i ASP har nu aldrig haft som formål at køre hurtigt, men er det hurtigt nok nu, er det selvfølgelig ok. Skift til fx VB.NET/ASP.NET og få det utroligt meget hurtigere.

Men du laver stadig een ting, der kan være langsomt: opbygning af streng med mange &-ere

Læs: http://www.developerfusion.co.uk/show/1685/  og http://www.developerfusion.co.uk/show/1685/2/

Der er nogen der siger de får deres kode til at køre 50 gange hurtigere - oftest nok mindre, men værd at prøve, hvis du synes det tager lang tid.

Og ja, i .NET er der en StringBuilder klasse, der kan gøre det for dig lidt mere elegant.
Avatar billede Slettet bruger
04. marts 2006 - 13:12 #5
Prøv at kigge på join, det er meget muligt at det ville være hurtigere at kopierer y-dimensionen ud i et en-dimensionelt array og så kalde join.
Avatar billede trer Nybegynder
04. marts 2006 - 13:24 #6
Erik>

jeg kan desværre ikke skifte til .NET, det er en HTA (HTML Application)- altså en dhtml fil med clientside script i vb - jeg arbejder på. Og jeg ønsker ikke at tilføje non-std componenter som StrCat.

Men jeg vil overveje hvad jeg har af muligheder for at undgå de mange re-allokeringer af strenge.

Kryptos> 

Som du kan se har jeg allerede overvejet at bruge join - men hvordan #¤%& kopierer jeg den ene dimension ud af et to-dim array uden at loope det igennem?
Avatar billede erikjacobsen Ekspert
04. marts 2006 - 13:43 #7
Man kan også programmere det i VBScript direkte - nok ikke lige 50 gange hurtigere. Du kan søge på google - det er li'som ikke et nyt problem.

Det må da være træls at være tvunget til at arbejde med gammel teknologi ;)
Avatar billede Slettet bruger
05. marts 2006 - 06:10 #8
Pointen er at det sikkert vil kunne betale sig at kopierer det og så lave join på det, VB-script eller for den sagsskyld alle sprog som har sammen form for string håndtering .NET inkluderet, er meget langsomme når det kommer til at lægge stringe sammen på & eller +.

Man kan ikke sige det 100% og du er der for nød til at prøve og tage et mål, men jeg har set det flere gange i VB applikationer at det faktisk betaler sig fordi kopiering og join er hurtigere end de mange små string operationer.

Vi er altså ude i noget der ligner:

redim xOneDim(xdim)

redim matrix(xdim,ydim)
for a = 0 to xdim
  redim enDim(ydim)
  for b = 0 to ydim
    enDim(b) = matrix(a,b)
  next
  xOneDim(a) = join(enDim, ",")
next
x = join(xOneDim, vbCRLF)

Du må lige pudse det til selv det er for tidligt på dagen ;)
Avatar billede trer Nybegynder
05. marts 2006 - 13:57 #9
Ok, jeg prøver det - og det er jo nemt nok at rette tilbage. 

Tak for indsatsen, Kryptos. Smid et svar, så får du points.
Avatar billede Slettet bruger
06. marts 2006 - 07:44 #10
svar;)
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