Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Performance von FindComponent (https://www.delphipraxis.net/24726-performance-von-findcomponent.html)

barnti 25. Jun 2004 07:46


Performance von FindComponent
 
Hallo Leute,
ich habe heute mal eine allgemeinere Frage.
Ich generiere die benötigten Komponenten meiner DB-Anwendung dynamisch aus den Inhalten der DB. Beim Start wird für jede Tabelle der DB eine Query-,Dataset- und Datasourcekomponente erzeugt. Diese sind Child-Objekte des Datenmoduls 'DM_Datenbank'.

Meine Frage: Wenn ich eine der Komponenten benötige, verwende ich den Aufruf 'DM_Datenbank.FindComponent(MeineKomponente)'.

Wie Performant ist dieser Aufruf?
Ist dies die beste Lösung die Komponenten zu finden?
Oder:
Ist es vielleicht besser die Komponenten beim Erzeugen in einem dyn. Array zu speichern(Dann müsste man den Index der benötigten Komponente ermitteln, um diese zu erhalten)?

roderich 25. Jun 2004 09:33

Re: Performance von FindComponent
 
hallo barnti,

berechtigte Frage, ich schätze aber FindComponent ziemlich schnell ein (wenn es nicht verkorkst implementiert ist).
Dürfte ja nichts anderes sein als eine Schleife von 0 bis ComponentCount-1 über Components. Sowas darf eigentlich nicht nennenswerte Laufzeit haben.

Roderich

alcaeus 25. Jun 2004 09:37

Re: Performance von FindComponent
 
Zitat:

Zitat von barnti
Ist es vielleicht besser die Komponenten beim Erzeugen in einem dyn. Array zu speichern(Dann müsste man den Index der benötigten Komponente ermitteln, um diese zu erhalten)?

Im Endeffekt kommt es aufs gleiche. Wie schon gesagt wurde läuft FindComponent auch nur über eine Komponentenliste drüber. Ob du es machst oder die schon vorhandene Prozedur macht keinen Unterschied.

Greetz
alcaeus

barnti 25. Jun 2004 09:45

Re: Performance von FindComponent
 
Hallo,
habe ich mir auch gedacht. Allerdings könnte es sein, dass je nach Cast-Operator (TmysqlQuery(Dm_Datenbank.FindComponent)) das ganze noch optimiert wird. Vielleicht ist dann FindComponent etwas schneller...?!

Robert_G 25. Jun 2004 14:10

Re: Performance von FindComponent
 
Warum verwendet jeder FindComponent????
Du hast doch schon einen Array of TComponent -> TCustomForm.Components[] !!!

Ein simples:
Delphi-Quellcode:
  XYZ     := TABC.Create(Self);
  fXYZ_cID := XYZ.ComponentID;
Über die ID kannst du jetzt immer auf deine Komponente zugreifen.

FindComponent MUSS durch den Array iterieren, um die Komponente nach Namen zu finden. Hast du die ID sparst du dir das Ganze.(außerdem sieht der Code sonst irgendwie Newbie-like aus. :roll: )

Zitat:

Zitat von Barnti
Allerdings könnte es sein, dass je nach Cast-Operator (TmysqlQuery(Dm_Datenbank.FindComponent)) das ganze noch optimiert wird. Vielleicht ist dann FindComponent etwas schneller...?!

Das bezweifele ich ernshaft.

p.s.: FindComponent ist auch nicht sooo langsam.
Schließlich ist es mit Sicherheit nur eine simple Iteration durch den Array Components á la:
Delphi-Quellcode:
for i := 0 to pred(ComponentCount) do
  if Components[i].Name = lSearchName then
  begin
    result := Components[i];
    break;
  end;

neolithos 25. Jun 2004 14:27

Re: Performance von FindComponent
 
Der Cast-Operator bedeuted für den Rechner den wenigsten aufwandt da der Compiler nur diese Interne Zahl anders interpretiert.

FindComponent ist das langsamste was ich kenne, dies merkt man wenn es in größeren Schleifen benutzt wird.

Grund: Eine Schleife über alle Elemente. (20 Steuerelmente + sage wird 20 mal suchen sind 400 Stringvergleiche)

Ein String vergleich ist, da ein Rechner nur zahlen versteht, ebenfalls eine Schleife. (ca 15 Zeichen pro Name sind 6000 cmp).

Cmp ist der Maschinen-Befehl zum vergleichen zweier Zahlen, welches durch eine Subtraktion gemacht wird.

Addiert man die Taktzyklen der andere langwierigen Stack-Operationen, Call, Jmp-Befehler, wird man schon auf ein paar ms kommen.



Und stellen wir gegenüber eine direkte Adressierung, über eine Variable, die meinetwegen vorher mittels FindComponent gesetzt wurde.
Wird man erschrecken. Ein Maschinen-Befehl (ergo 20)!

Oben sind es schätzungsweise 10000 (nicht nachgrechnet).

Robert_G 25. Jun 2004 14:41

Re: Performance von FindComponent
 
Zitat:

FindComponent ist das langsamste was ich kenne, dies merkt man wenn es in größeren Schleifen benutzt wird.
Dann ist ja gut...
Ich dachte schon ich hätte was verpasst. :lol:

Ich habe schon eine Allergie gegen solchen ItemByName-Käse seit ich vor 1,5 Jahren mit Delphi angefangen habe. ;)

DP-Maintenance 25. Jun 2004 14:49

DP-Maintenance
 
Dieses Thema wurde von "Daniel" von "Datenbanken" nach "VCL-Komponenten und Controls" verschoben.
Scheint mir doch eher zu den VCL-Fragen zu gehören.

neolithos 25. Jun 2004 15:00

Re: Performance von FindComponent
 
Vorallem findet so der Compiler keine fehlzugriffe!


Bsp:

Eine Componente Names txtTest wird in txtText umbenannt.

Der Compiler-meckert kein bißchen wenn man mittels FindComponent darauf zugreift!

barnti 25. Jun 2004 21:59

Re: Performance von FindComponent
 
Zitat:

Zitat von Robert_G
Warum verwendet jeder FindComponent????
Du hast doch schon einen Array of TComponent -> TCustomForm.Components[] !!!

Ein simples:
Delphi-Quellcode:
  XYZ     := TABC.Create(Self);
  fXYZ_cID := XYZ.ComponentID;
Über die ID kannst du jetzt immer auf deine Komponente zugreifen.

FindComponent MUSS durch den Array iterieren, um die Komponente nach Namen zu finden. Hast du die ID sparst du dir das Ganze.(außerdem sieht der Code sonst irgendwie Newbie-like aus. :roll: )

Das ist mir bekannt! Mein Problem ist: Alle DB-Komponenten werden dyn. erzeugt. Zusätzlich wird die Oberfläche je nach DB-Inhalt angepasst, so dass für jede Tabelle eine Zugriffsmöglichkeit besteht. Die Schwierigkeit besteht darin bei einen Klick auf den Button 'Kunde' auch die Inhalte geladen werden müssen. Dazu müssen die DB-Komponenten identifiziert werden. Ergo spreche ich diese entweder über 'FindComponent(Tabellenname)' oder über die Suche über den Namen im Komponentenarray an...
Habe ich die ID allein nützt mit das noch nichts. Oder? Ich lasse mich gern aufklären.


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