AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Performance von FindComponent

Ein Thema von barnti · begonnen am 25. Jun 2004 · letzter Beitrag vom 25. Jun 2004
Antwort Antwort
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#1

Performance von FindComponent

  Alt 25. Jun 2004, 07:46
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)?
Gruß,

Barnti
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#2

Re: Performance von FindComponent

  Alt 25. Jun 2004, 09:33
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
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: Performance von FindComponent

  Alt 25. Jun 2004, 09:37
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Performance von FindComponent

  Alt 25. Jun 2004, 09:45
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...?!
Gruß,

Barnti
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: Performance von FindComponent

  Alt 25. Jun 2004, 14:10
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. )

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;
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#6

Re: Performance von FindComponent

  Alt 25. Jun 2004, 14:27
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).
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#7

Re: Performance von FindComponent

  Alt 25. Jun 2004, 14:41
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.

Ich habe schon eine Allergie gegen solchen ItemByName-Käse seit ich vor 1,5 Jahren mit Delphi angefangen habe.
  Mit Zitat antworten Zitat
25. Jun 2004, 14:49
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

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#9

Re: Performance von FindComponent

  Alt 25. Jun 2004, 15:00
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!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Performance von FindComponent

  Alt 25. Jun 2004, 21:59
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. )
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.
Gruß,

Barnti
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 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