Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Feste und dynamische Array in Bezug auf ihre Geschwindigkeit
Delete - Di 15.03.05 19:45
Titel: Feste und dynamische Array in Bezug auf ihre Geschwindigkeit
Hallo!
Ich habe eine Funktion mit ASM Geschwindigkeitsoptimiert (mit MMX und SSE2). Diese Funktion arbeitet mit Arrays. Als ich nun anstatt dem festen Array ein dynamisches Array genommen habe, wurde alle Varianten der Funktion langsamer. Weiß jemand, woran das liegen kann? Gibt es da einen Unterschied zwischen den beiden Typen von Arrays?
delfiphan - Di 15.03.05 20:14
Sobald etwas nicht fix ist bzw. zur Compilezeit unbekannt ist, desto mehr Information muss während der Laufzeit beim Aufruf einer Funktion übergeben werden. Ein
procedure abc(a : array of Char) sieht für Delphi intern pseudomässig eher so aus:
procedure abc(a : array of Char; Low, Length : Integer).
Bei dynamischen Arrays kommt zusätzlich noch ein Overhead fürs Reference-Counting hinzu (Bei jeder Kopie des Pointers gibt es einen zusätzlichen Overhead).
Vielleicht probierst du mal folgendes aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure abc(var Data); Var Arr : Array[0..9] of Anytype absolute Data; begin end; Var MyArr : array of Anytype; begin abc(MyArr[0]); end; |
Delete - Di 15.03.05 20:24
delfiphan hat folgendes geschrieben: |
Bei dynamischen Arrays kommt zusätzlich noch ein Overhead fürs Reference-Counting hinzu (Bei jeder Kopie des Pointers gibt es einen zusätzlichen Overhead).
|
So ganz verstehe ich das noch nicht. Was genau soll dieser Overhead und der Reference-Counting?
Ich übergebe einen Pointer auf das Array an die Funktion und die Funktion ist komplett in ASM geschrieben. Ich setze einfach den Pointer auf den Anfang des Arrays und inkrementier dann den Pointer. Da sollte es doch egal sein, wie groß das Array ist.
delfiphan - Di 15.03.05 20:37
Wenn du nen Pointer übergibst, dann liegt's nicht an deiner Funktion, sondern am ganzen Rest.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| Var A, B : array of Anytype; begin SetLength(A, 3); B := A; end; |
Sieh dir mal den Assemblercode davon an, und geh Schritt für Schritt durch, dann siehst du, wieviel Code für diese zwei Zeilchen ausgeführt werden muss.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!