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..9of Anytype absolute Data;
begin
 // ...
end;
Var
 MyArr : array of Anytype;
begin
 // ... SetLength, etc.
 abc(MyArr[0]);
end;


Delete - Di 15.03.05 20:24

user profile icondelfiphan 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.