Autor Beitrag
Overbenny
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 15.03.05 19:45 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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:
ausblenden 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;
Overbenny
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 15.03.05 20:37 
Wenn du nen Pointer übergibst, dann liegt's nicht an deiner Funktion, sondern am ganzen Rest.
ausblenden 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.