Gleiches Array mal schneller mal langsamer auslesen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Kruemelator

Betreff: Gleiches Array mal schneller mal langsamer auslesen

BeitragFr, Dez 18, 2009 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich ein mehrdimensionales Array erstelle, und dann alle "Zellen" mit For-Schleifen durch gehe und addiere dann dauert das jenachdem wie herum ich es mache länger oder kürzer, und bei größeren Array fällt es schon recht stark auf. Ich würde gerne wissen warum.
Beispiel von mir, mit b-For-Schleife in der a-For-Schleife:
feld(a,b) brauchte 4173
feld(b,a) brauchte 1847

Code: [AUSKLAPPEN]
Dim feld(3999,3999)

time = MilliSecs()
For a=0 To 3999
For b=0 To 3999
   wert = wert + feld(a,b)
Next
Next
Print MilliSecs()-time
wert = 0

time = MilliSecs()
For a=0 To 3999
For b=0 To 3999
   wert = wert + feld(b,a)
Next
Next
Print MilliSecs()-time


Wusste nicht so wirklich ob das hierhin gehört, sonst einfach verschieben.
Gruß Kruemelator

mpmxyz

BeitragFr, Dez 18, 2009 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist aber wirklich seltsam...
Ich habe den Code ein bischen erweitert:
BlitzBasic: [AUSKLAPPEN]
Dim feld(3999,3999)

Local a,b
Local time
Local wert
time = MilliSecs()
For a=0 To 3999
For b=0 To 3999
wert = wert + feld(a,b)
Next
Next
Print MilliSecs()-time
wert = 0

time = MilliSecs()
For a=0 To 3999
For b=0 To 3999
wert = wert + feld(b,a)
Next
Next
Print MilliSecs()-time
wert = 0
time = MilliSecs()
For b=0 To 3999
For a=0 To 3999
wert = wert + feld(a,b)
Next
Next
Print MilliSecs()-time
wert = 0
time = MilliSecs()
For b=0 To 3999
For a=0 To 3999
wert = wert + feld(b,a)
Next
Next
Print MilliSecs()-time
WaitKey

Meine Ergebnisse:
Code: [AUSKLAPPEN]
b in a; (a,b): 275 ms
b in a; (b,a): 97 ms
a in b: (a,b): 98 ms
a in b: (b,a): 216 ms


Ich habe auch noch viele andere Sachen ausprobiert... Ich finde kein System dahinter...
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Dez 18, 2009 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil die Daten auch in einem 2D-Array intern im Grunde hintereinander gespeichert werden. Wenn du nun zuerst einzele Zellen der Spalten abgehst und dann erst die Zeilen, dann werden die Daten nicht linear vom Speicher abgerufen. Das widersetzt zwar der Bezeichnung RAM, aber tatsächlich unternimmt ein moderner Rechner (der letzten ~10 Jahre) auch Sachen vor die tatsächlich noch nicht abgerufen wurden, aber mit aller Wahrscheinlichkeit dran kommen könnten. Da der RAM mit so der langsamste Speicherabruf (ausgenommen Festplatten, USB-Sticks...) ist, wird nach dem auslesen einer Zelle an Position 80,60 schon 81,60 in den nächst schnelleren Speicher (das kann dann der L3 oder L2 -Cache sein) eingetragen. Womit es dann sofort zur Verfügung steht, wenn danach gefragt wird.

Edit1:

Aus diesem Grund sollte man immer auch folgendes machen:

Code: [AUSKLAPPEN]
For Y=0 To 599
   For X=0 To 799
      Machen X,Y
   Next
Next
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Kruemelator

BeitragFr, Dez 18, 2009 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Also immer die innerste For-Schleife an die erste Stelle, oder habe ich das jetzt falsch verstanden?

Edit:
Das selbe kann dann doch auch bei Banken entstehen oder?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Dez 18, 2009 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht nur bei Banken, sondern auch beim Abruf von Tiles die in einem Image als LoadAnimImage geladen wurden. Allerdings bleiben dem Programmierer beim letzterem kaum Optimierungschancen. Also immer im Hinterkopf belassen: Den Speicher immer so linear abrufen wie nur möglich.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group