Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten (https://www.delphipraxis.net/166017-wie-teuer-ist-ein-wiederholtes-create-destroy-von-objekten.html)

tofse 26. Jan 2012 09:02

Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Hallo und guten Morgen,
ich habe mal eine grundsätzliche Frage.
Aktuell programmiere ich einen Terminkalender. Die Termine sind in einer Datenbank gehalten und für die Darstellung verwende ich eine eigene, von TPanel abgeleitete, Komponente.
Aktuell gehe ich beim Laden einer Kalenderansicht so vor, dass ich alle gewünschten Termine aus der Datenbank hole und dann für jeden Termin ein Objekt von meiner Komponente erzeuge, um den jeweiligen Termin darzustellen.
Wechsel ich nun die Kalenderansicht, rufe ich zunächst für jedes Objekt .free auf und lade danach wieder die Termine, um dann erneut die Objekte zu erzeugen.

So, das als Einleitung und nun die eigentliche Frage: Wie viel Ressourcen könnte so ein wiederholtes Create und free von Objekten binden? Ich erwarte jetzt keinen Wert oder so, mir geht es nur darum, ob es sich lohnt, darüber den Kopf zu zerbrechen, oder ist das völlig unnötig...? Als Alternative könnte ich mir halt vorstellen, einmal erzeugte Objekte zu behalten und in einer extra Liste zu verwalten. Beim Neuladen der Termine würde ich dann alle Terminobjekte nur leeren und ausblenden, um sie bei Bedarf wieder aus der List o.ä. zu holen. Allerdings müsste ich dann einiges ändern, deshalb die Grundsatzfrage.

Ich hoffe, ich konnte mein Anliegen einigermaßen verständlich rüberbringen :-)

Grüße
Christof

Iwo Asnet 26. Jan 2012 09:46

AW: Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Ich würde konsequent sauber programmieren, d.h. so wie Du es machst, hört es sich gut an.
Ein wenig Overhead hat man natürlich, wobei der Speichermanager gute Arbeit leistet.

Du könntest einen ObjectPool erstellen, also freigegebene Objekte in einer Liste parken und wenn ein neues Objekt angefordert wird, erstmal schauen, ob noch ein geparktes Objekt in der Liste ist. Aber so ähnlich macht es der Speichermanager auch, also sparst Du dir vielleicht die Konstruktorlogik.

Andererseits musst Du ein Objekt aber auch plattmachen, wenn Du es (neu) zur Verfügung stellst...

Wenn es wirklich wirklich auf Performance ankommt, und Du irgendwelche Objekte millionenfach freigibst und alloziieren willst, dann verwende vielleicht lieber (statische) Records. Aber das hast Du ja nicht.

tofse 26. Jan 2012 09:49

AW: Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Hallo,
super! Es handelt sich pro Kalenderansicht um ca. 150 Objekte. Von daher hake ich das Thema gedanklich wieder ab :-)
Danke

bernau 26. Jan 2012 10:33

AW: Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Vor dem Problem stand ich auch mal. Erzeugen und freigeben von "normalen" Objekten geht ja sehr schnell. Sobald etwas von TCustomControl abgeleitet ist, dann dauert das ziemlich lange. Ich habe es letztendlich genau so gemacht, wie du beschrieben hast.

Die Objekte nicht freigegeben, sondern in einer Liste "geparkt" und bei Bedarf einfach wieder sichtbar gemacht.

stahli 26. Jan 2012 11:41

AW: Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Ich mache es ein etwas anders.
In einem Designer stelle ich dynamisch x Objekte dar (auch Panelableitungen).

Soll eine andere Menge dargestellt werden, nutze ich die bereits vorhandenen Panels und weise denen einfach die neuen Positionen usw zu.

Existiert ein benötigtes Panel noch nicht, wird es neu erstellt.

Sind von der vorherigen Darstellung noch Panels übrig, werden diese gelöscht. (Wenn eines davon allerdings gerade den Focus hat, muss man das u.U. gesondert behandeln um Schutzverletzungen von Windows zu vermeiden, da Windows später meinen könnte, das Control nochmal zeichnen zu müssen).

Ich denke, dass diese Verfahrensweise etwas flüssiger wirken könnte.
Create und Destroy fallen sicher nicht ins Gewicht, aber die Reduzierung der Neuzeichnungen könnte sich bemerkbar machen.

tofse 26. Jan 2012 11:47

AW: Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Hallo,

danke für die Antworten. Ich habe mein Programm nun doch umgebaut. Ich merke mir die Objekte in einem Pool und greife bei Bedarf darauf zu. Ich lösche gar keine Objekte mehr, sondern die bleiben bis zum Programmende im Pool, falls sie nicht benötigt werden. Werden sowieso nicht sooo viele sein, die immer im Pool verbleiben, da in diesem "Spezial" Kalender immer eine ähnliche Anzahl von Objekte pro Ansicht vorhanden sein wird.

Mit meinen Testdaten merke ich jetzt natürlich noch keinen Unterschied, wird sich dann aber zeigen.

Christof

bernau 26. Jan 2012 12:27

AW: Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Zitat:

Zitat von stahli (Beitrag 1147729)
Existiert ein benötigtes Panel noch nicht, wird es neu erstellt.

Sind von der vorherigen Darstellung noch Panels übrig, werden diese gelöscht.

Prinzipiell OK. Wenn die Menge der Objekte stark variiert, dann ist das "Merken in einer Liste" vorteilhafter.

shmia 26. Jan 2012 15:37

AW: Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Zusatzinfo:
Der Aufwand zum Erzeugen und Zerstören von Komponenten hat einen quadratischen Anteil.
Der Grund ist, dass jede Komponente über den Owner seinen Besitzer kennt (und umgekehrt) und bei jedem Erzeugen/Zerstören die prozedure Notification für alle Komponenten des Owners ausgelöst wird.

Patito 26. Jan 2012 15:56

AW: Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Zitat:

Zitat von tofse (Beitrag 1147731)

Mit meinen Testdaten merke ich jetzt natürlich noch keinen Unterschied, wird sich dann aber zeigen.

Zur Performanceoptimierung solltest Du Dir das ganze mal in einem Profiler anschauen, z.B. AQTime oder mit dem Sampling-Profiler von Eric Grange.

http://delphitools.info/samplingprofiler/

Dann siehst Du, ob es sich lohnt...
Mit einem vernünftigen Speicher Manager (du verwendest hoffentlich FastMM) sollten 150 Objekte eher unsichtbar sein...
Wirklich lohnen wird sich das nur wenn die Objekte im Constructor irgendetwas nicht-triviales machen (Netzwerkverbindung, Datenbankabfrage, Logging, Synchronisation über Windows-Events, ...).
Sowas gehört aber normalerweise eh nicht in einen Constructor.

Iwo Asnet 26. Jan 2012 16:22

AW: Wie "teuer" ist ein wiederholtes Create & Destroy von Objekten
 
Zitat:

Zitat von shmia (Beitrag 1147805)
Der Aufwand zum Erzeugen und Zerstören von Komponenten hat einen quadratischen Anteil.

Vielleicht sollte Emba hier mal nachbessern, wozu gibt es schließlich Hashmaps.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 Uhr.
Seite 1 von 2  1 2      

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