AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Performance TpFIBDataset
Thema durchsuchen
Ansicht
Themen-Optionen

Performance TpFIBDataset

Ein Thema von nachti1505 · begonnen am 23. Okt 2008 · letzter Beitrag vom 29. Okt 2008
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#1

Performance TpFIBDataset

  Alt 23. Okt 2008, 12:45
Datenbank: Firebird • Version: 2.0 • Zugriff über: FIBPlus
Ich möchte die Daten eine Tabelle gerne in ein Stringgrid laden. Das StringGrid hat dazu mehrere Spalten (Columns).

Folgender Code:

Delphi-Quellcode:
var
  Dataset: TpFIBDataset;

begin
  Dataset.DisableControls;
  Dataset.First;
  while NOT Dataset.Eof do begin
    for i := 0 to StringGrid.Columns.Count - 1 do begin
      StringGrid.Cells[i, Dataset.RecNo] := Dataset.FindField(StringGrid.Columns[i].DataField);
    end;
    Dataset.Next;
  end;
  Dataset.EnableControls;
end;
Dummerweise benötigt dieses Vorgehen für knapp 1000 Datensätze um die 4sec??? Die Variante mit einem simplen FIBQuery hingegen erledigt das ganze in Bruchteilen davon...

Kommentiert man Zeile 9 (... Dataset.FindField ...) hingegen aus, so beträgt die Laufzeit nur noch Millisekunden. Kann es ein, dass FindField extrem langsam ist? Welche Vorschläge zur Performancesteigerung könnt ihr machen?

Vielen Dank
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Performance TpFIBDataset

  Alt 23. Okt 2008, 13:44
Seit wann gibt es ein stringgrid.Columns ?? Allgemein würde ich immer where benutzen, anstatt das bereits sichtbare zu durchsuchen.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Performance TpFIBDataset

  Alt 23. Okt 2008, 14:03
Zitat von Hansa:
Seit wann gibt es ein stringgrid.Columns ??
Ist von mir erweitert worden, um eine DBGrid Funktionalität nachzubilden... hätte ich vllt erwähnen sollen...

Zitat von Hansa:
Allgemein würde ich immer where benutzen, anstatt das bereits sichtbare zu durchsuchen.
Das bereits sichtbare soll nicht durchsucht werden, sondern das Ergebnis einer SQL-Abfrage (ob mit WHERE (gefiltert) oder ohne WHERE (ungefiltert)) im obigen StringGrid dargestellt werden.

Prinzipiell geht meine Frage dahin, ob sich
StringGrid.Cells[i, Dataset.RecNo] := Dataset.FindField(StringGrid.Columns[i].DataField); performanter ausdrücken lässt, da es von der Laufzeit her wohl an dieser Stelle zu Engpässen kommt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

Re: Performance TpFIBDataset

  Alt 23. Okt 2008, 14:07
Ich kenne FIBPlus leider nicht, aber gibt es dort nicht evtl. ein Fields-Array, auf das Du direkt zugreifen könntest?StringGrid.Cells[i, Dataset.RecNo] := Dataset.Fields[i]; Oder etwas Ähnliches zumindest, da ich mir denken könnte, dass FindField intern mit einer Schleife arbeitet.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Performance TpFIBDataset

  Alt 23. Okt 2008, 14:13
Die Idee hatte ich auch schon, ändert leider nicht signifikant etwas. Nutze jetzt aus FIBPlus das FieldByFieldNo. Ändert die Ladezeit von 4s auf 3s... Ist mir aber immer noch zu lang.

Eine (testweise) aufgesetzte UIBQuery benötigt dafür irgendwas im Bereich von 60ms.... Komisch!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Performance TpFIBDataset

  Alt 23. Okt 2008, 14:17
Zitat von nachti1505:
... hätte ich vllt erwähnen sollen...
vllt ? Die Frage an sich wurde durch Unterschlagung wichtiger Informationen so gut wie unbrauchbar gemacht. Die alleine nützt nichts :

Lasse doch mal hier das Stringgrid weg :
StringGrid.Cells[i, Dataset.RecNo] := Dataset.FindField(StringGrid.Columns[i].DataField); Es stellt sich schließlich die Frage, ob das zusammengebastelte Stringgrid schuld ist oder ein falsch zusammengebautes Dataset.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

Re: Performance TpFIBDataset

  Alt 23. Okt 2008, 14:19
Ich hab auch ein wenig das Stringgrid im Verdacht. Evtl. könnte man mit BeginUpdate und EndUpdate noch etwas herausholen, die Frage ist nur, Cols oder Rows.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Performance TpFIBDataset

  Alt 23. Okt 2008, 14:31
StringGrid scheint es gar nicht zu sein. Habe aus
StringGrid1.Cells[i, Dataset.RecNo] := Dataset.FieldByFieldNo(i).AsString; mal folgendes gemacht:
Dataset.FieldByFieldNo(i).AsString; Und die Laufzeiten bleiben identisch.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: Performance TpFIBDataset

  Alt 23. Okt 2008, 14:33
Wenn das nicht dem Stringgrid zugewiesen wird, wem dann ? Mache doch einfach ein showmessage oder ein memo.lines.add.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Performance TpFIBDataset

  Alt 23. Okt 2008, 14:40
@Hansa...
Durch die eben gezeigte Änderung wird zwar nichts zugewiesen, es ließ sich aber eindeutig klären, ob StringGrid oder Dataset für die Performanzeinbrüche verantwortlich sind. Das das StringGrid nicht mehr in der Anweisung vorkommt und das Dataset nach wie vor das macht, was es machen soll --> Laufzeit hängt vom Dataset ab!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 02:03 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