Gleiches Array mal schneller mal langsamer auslesen
Übersicht

KruemelatorBetreff: Gleiches Array mal schneller mal langsamer auslesen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist aber wirklich seltsam...
Ich habe den Code ein bischen erweitert: BlitzBasic: [AUSKLAPPEN] Dim feld(3999,3999) 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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group