Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Langsamer Zugriff auf Items einer TObjectList (https://www.delphipraxis.net/21748-langsamer-zugriff-auf-items-einer-tobjectlist.html)

mirage228 7. Mai 2004 16:17


Langsamer Zugriff auf Items einer TObjectList
 
Hallo,

ich benutze eine TObjectList um eine Liste von Objekten zu speichern.

Jetzt habe ich folgendes festgestellt: Je mehr Items in der List desto langsamer wird das ganze. Bei 1 Item sind es noch Ticks, bei 15 Items 140 Ticks :shock:

Ich benutze folgenden Code, den ich als "schuldigen Isolieren" konnte.

Delphi-Quellcode:
procedure Changed(Sender: TObject);
var
  Index: Integer;
begin
  if (Sender is TSynEdit) then
    Index := FOwner.FSynEdit.IndexOf(Sender) else
  Index := FOwner.FRichEdit.IndexOf(Sender);
  if @FOnChange <> nil then
    FOnChange(FDocuments.Document[Index]); // hier Geschwindigkeitseinbruch
end;
Der Zugriff auf "Document[Index]" wird durch einen getter erledigt, der so aussieht:
Delphi-Quellcode:
function TXGENDocumentList.GetItem(Index: Integer): TXGENDocument;
begin
  Result := TXGENDocument(FList.Items[Index]);
end;
Wobei FSynEdit, FRichEdit und FList eine TObjectList sind.

Wie lässt sich dieser extreme Geschwindigkeitseinbruch erklären und wie kann ich ihn beheben?

mfG
mirage228
[/delphi]

mirage228 7. Mai 2004 20:39

Re: Langsamer Zugriff auf Items einer TObjectList
 
Hi,

es gibt "Entwarnung!"

Nach ausgiebiger Suche habe ich herausgefunden, dass der Übeltäter in einer Methode steckt die von einer Methode im "FOnChange" aufgerufen wurden. Dabei wurde bei jeder eingabe eine TreeView gelöscht, und je nach Anzahl der Dokumente ein Item mit dem Dokumentnamen eingefügt und bei mehreren Dokumenten hat das halt sehr lange gedauert.

Meine Problemlösung sah dann so aus:
- Es wurde geprüft, ob das TreeView überhaupt sichtbar bevor gezeichnet wird
- Das ganze wurde in eine abgetrennte Prozedur ausgelagert die nun zusätzlich aufgerufen werden muss. (Sie steckte vorher in einer Prozedur die bei jedem Tastendruck in eine Edit ausgeführt wurde :-\ )
- Die Prozedur zum Zeichnen der TreeView Einträge wurde verbessert. Einträge werden nun nicht immer gelöscht, sondern, falls sie vorhanden sind, geupdated.

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 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