Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Performance einer TObjectList (https://www.delphipraxis.net/192053-performance-einer-tobjectlist.html)

Codehunter 17. Mär 2017 07:22


Performance einer TObjectList
 
Moin!

Folgendes Szenario (stark vereinfachter Pseudocode):
Delphi-Quellcode:
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;
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 (
Delphi-Quellcode:
SetLength(L, 17000)
, nicht mit sowas wie
Delphi-Quellcode:
SetLength(L, Length(L)+1)
) versucht. Die Misere ist überall die selbe.

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

hoika 17. Mär 2017 07:54

AW: Performance einer TObjectList
 
Hallo,
also bei mir läuft der Code im Millisekunden-Bereich durch.

Delphi-Quellcode:
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;
Das DoSomething hatte ich auskommentiert.
Hast du mal ohne Debugger geprüft?

Codehunter 17. Mär 2017 08:11

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...

Der schöne Günther 17. Mär 2017 08:56

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 03:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz