Warf hat geschrieben:Der Vorteil beim Dynamischen Array liegt einfach darin, dass alles als ein Speicherblock behandelt wird.
Der Zugriff auf ein Array Element ist ziemlich intern sehr simpel
Itm := ListHead;
for i:=0 to 5 do
Itm:=Itm^.Next;
result := Itm^.Value;
Wo hast du denn das her?
TList bzw. TFPList verwenden intern ebenfalls ein Array. Die Speicherverwaltung wird hier aber selbst implementiert (d.h. kein dynamsiches Array).
Am Ende ist TFPList nur eine Erweiterung eines Arrays um diverse Standardmethoden, die man bei praktisch jedem Array braucht (mal mehr mal weniger). TList erweitert TFPList um die Fähigkeit Ereignisse auszulösen.
Warum TFPList signifikant langsamer sein sollte als ein Array, offenbart sich mir nicht - außer man arbeitet auf Zeigerebene. Dann stelle ich aber die Frage, warum man denn überhaupt ein Array verwendet.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Warf hat geschrieben:Der Vorteil beim Dynamischen Array liegt einfach darin, dass alles als ein Speicherblock behandelt wird.
Der Zugriff auf ein Array Element ist ziemlich intern sehr simpel
Itm := ListHead;
for i:=0 to 5 do
Itm:=Itm^.Next;
result := Itm^.Value;
Wo hast du denn das her?
TList bzw. TFPList verwenden intern ebenfalls ein Array. Die Speicherverwaltung wird hier aber selbst implementiert (d.h. kein dynamsiches Array).
Am Ende ist TFPList nur eine Erweiterung eines Arrays um diverse Standardmethoden, die man bei praktisch jedem Array braucht (mal mehr mal weniger). TList erweitert TFPList um die Fähigkeit Ereignisse auszulösen.
Warum TFPList signifikant langsamer sein sollte als ein Array, offenbart sich mir nicht - außer man arbeitet auf Zeigerebene. Dann stelle ich aber die Frage, warum man denn überhaupt ein Array verwendet.
Mensch wieder was gelernt. Die Listen Implementierung in den meisten anderen Sprachen (.Net oder Java) eine Liste im mathematischen Sinne (Siehe meinen Post oben), daher habe ich gedacht in Pascal wäre es auch so
mse hat geschrieben:Ich verwende dynamische Arrays sehr häufig, TList und Konsorten aus Performance-Gründen praktisch nie.
Für das bequeme Arbeiten mit dynarrays habe ich die unit msearrayutils gemacht, welche Sortierung und ähnliches zur Verfügung stellt.
Wenn dynamische Arrays nicht mehr ausreichen, verwende ich die Listenklassen aus den units msedatalist und mselist. Die sind aber nicht Delphi-kompatibel und beruhen nicht auf TList.
Dynamische Arrays produzieren durch die Referenzzählung einen ziemlichen Overhead. (Exception Frame, ...)
Für performancekritische Sachen halte ich die dynarrays daher für etwas problematisch.
Durch selber geschriebene Listen-Klassen kann man wohl am meisten erreichen.
TList und TObjectList sind keine Rennwagen, aber auch nicht ganz schlecht.
mse hat geschrieben:TList und Konsorten aus Performance-Gründen praktisch nie.
Die Verwaltung der Pointer bei TList ist ja einfach "linear" und deshalb reichlich primitiv und nicht Performance-optimiert. Bei "delete" auf das erste Element muss alles verschoben werden. Für FiFos also total daneben. Eine Hash oder BTree-ähnliche Verwaltung wäre bei großen Listen möglicherweise viel performanter.
-Michael
Zuletzt geändert von mschnell am Do 26. Feb 2015, 09:22, insgesamt 1-mal geändert.
Patito hat geschrieben:
Dynamische Arrays produzieren durch die Referenzzählung einen ziemlichen Overhead. (Exception Frame, ...)
Für performancekritische Sachen halte ich die dynarrays daher für etwas problematisch.
Durch selber geschriebene Listen-Klassen kann man wohl am meisten erreichen.
TList und TObjectList sind keine Rennwagen, aber auch nicht ganz schlecht.
Natürlich muss man dynamische Arrays richtig einsetzen, dann sind sie aber unschlagbar und durch die Referenzzählung und die automatische finalization der items auch sehr bequem. Die Referenzzählung wird nur beim kopieren angesprungen, bei "const" und "var" Parametern z.B. nicht. Sie eignen sich auch gut dazu um mittels Pointern die Daten zu manipulieren.
mse hat geschrieben:TList und Konsorten aus Performance-Gründen praktisch nie.
Die Verwaltung der Pointer bei TList ist ja einfach "linear" und deshalb reichlich primitiv und nicht Performance-optimiert. Bei "delete" auf das erste Element muss alles verschoben werden. Für FiFos also total daneben. Eine Hash oder BTree-ähnliche Verwaltung wäre dafür möglicherweise viel performanter.
Das Problem ist hauptsächlich der Overhead beim item-Zugriff durch die Bereichsüberprüfung und die Eventhandler. Wenn man keine Eventhandler braucht ist ein dynamisches Array häufig ausreichend. Die Bereichsüberprüfung lässt sich bei Bedarf ja mittels Compilerschalter aktivieren.