TList, Vorteil ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TList, Vorteil ?

Beitrag von Socke »

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

Code: Alles auswählen

IntArr[5] = PInteger(DWord(IntArr)+5*SizeOf(Integer))^
während bei Listen ein Eintrag den Verweis auf den Nächsten Eintrag hat List[5] ist also intern

Code: Alles auswählen

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
Beiträge: 2122
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TList, Vorteil ?

Beitrag von Warf »

Socke hat geschrieben:
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

Code: Alles auswählen

IntArr[5] = PInteger(DWord(IntArr)+5*SizeOf(Integer))^
während bei Listen ein Eintrag den Verweis auf den Nächsten Eintrag hat List[5] ist also intern

Code: Alles auswählen

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

BeniBela
Beiträge: 320
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: TList, Vorteil ?

Beitrag von BeniBela »

Socke hat geschrieben: Warum TFPList signifikant langsamer sein sollte als ein Array, offenbart sich mir nicht .
Signifikant nicht, aber TFPList speichert Pointer zu Werten, statt die Werte selbst.

Das ruiniert einem das ganze Caching

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TList, Vorteil ?

Beitrag von Patito »

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.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: TList, Vorteil ?

Beitrag von mschnell »

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.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TList, Vorteil ?

Beitrag von mse »

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
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TList, Vorteil ?

Beitrag von mse »

mschnell hat geschrieben:
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.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: TList, Vorteil ?

Beitrag von mschnell »

mse hat geschrieben:Das Problem ist hauptsächlich der Overhead beim item-Zugriff durch die Bereichsüberprüfung und die Eventhandler.
Hmm. myList.Delete(0) bei einer großen Liste ist ein beliebig schlimmes Performance-Problem :twisted:

-Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TList, Vorteil ?

Beitrag von mse »

mschnell hat geschrieben:Hmm. myList.Delete(0) bei einer großen Liste ist ein beliebig schlimmes Performance-Problem :twisted:
Es geht hier um den Vergleich TList <-> dynamisches Array.

Antworten