Einzelnen Beitrag anzeigen

Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Performance einer TObjectList

  Alt 17. Mär 2017, 08:22
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 (SetLength(L, 17000) , nicht mit sowas wie 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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter (17. Mär 2017 um 08:24 Uhr)
  Mit Zitat antworten Zitat