![]() |
Performance einer TObjectList
Moin!
Folgendes Szenario (stark vereinfachter Pseudocode):
Delphi-Quellcode:
Ohne L.Add dauert der Spaß ~ 3 Sekunden, mit L.Add 14 Sekunden. Das Erzeugen der Objekte und die Aktionen mit ihnen sind definitiv nicht das Problem, 3 Sekunden wären hier durchaus akzeptabel. Doch warum ist TObjectList so inperformant? Ich habe es testweise mit TObjectList aus System.Contnrs, TObjectList aus System.Generics.Collections und mit einem dynamischen Array of TObject (
var
I: Integer; L: TObjectList; O: TObject; begin L:= TObjectList.Create(TRUE); L.Capacity:= 17000; for I := 0 to 17000 do begin O:= TObject.Create; O.DoSomething; L.Add(O); end; end;
Delphi-Quellcode:
, nicht mit sowas wie
SetLength(L, 17000)
Delphi-Quellcode:
) versucht. Die Misere ist überall die selbe.
SetLength(L, Length(L)+1)
Weiterhin ist mir aufgefallen, dass das Programm nach dem Erzeugen der Objekte beim Beenden der Anwendung ebenfalls extrem lange braucht um die Objekte wieder freizugeben. Für Tips wäre ich sehr dankbar. Grüße Cody |
AW: Performance einer TObjectList
Hallo,
also bei mir läuft der Code im Millisekunden-Bereich durch.
Delphi-Quellcode:
Das DoSomething hatte ich auskommentiert.
uses
Contnrs; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; L: TObjectList; O: TObject; begin MessageBox(0, 'Start', '', 0); L:= TObjectList.Create(TRUE); L.Capacity:= 17000; for I := 0 to 17000 do begin O:= TObject.Create; //O.DoSomething; L.Add(O); end; MessageBox(0, 'Ende', '', 0); end; Hast du mal ohne Debugger geprüft? |
AW: Performance einer TObjectList
Habe das Problem zur Sekunde gerade selber gefunden. Die ObjectList hat einen zusätzlichen Eventhandler, welcher zur Verzögerung geführt hat. Wenn man nicht alles selber schreibt... :twisted:
Warum dann aber das dynamische Array auch so lahm ist, kann ich mir nicht erklären. Dort scheint die "Performance" andere Gründe zu haben. Ich glaube ich muss den Code mal eingehender auseinander nehmen. Da geht die Zeit hin. Hätt ich glatt selbst billiger schreiben können statt einzukaufen... |
AW: Performance einer TObjectList
Was hast du eingekauft? Vielleicht ist es für mich noch früh am Morgen, aber dein Code dauert mit 17.000 Einträgen auf meinem Rechner auf 32 und 64 Bit ca 0,7 - 0,8 ms.
Tipps: Du hängst einen Eintrag mehr an deine Liste an als du als Kapazität festgelegt hast. Beim Array machst du wahrscheinlich ähnliches: Ein bestehendes Array wieder zu vergrößern kostet Zeit. Wenn du dir nicht sicher bist wo die Zeit hingeht, nimm einen Profiler. Ein ominöser Notify-Handler der List es nämlich sicher nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz