![]() |
Datenbank: Firebird • Version: 2.0 • Zugriff über: FIBPlus
Performance TpFIBDataset
Ich möchte die Daten eine Tabelle gerne in ein Stringgrid laden. Das StringGrid hat dazu mehrere Spalten (Columns).
Folgender Code:
Delphi-Quellcode:
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...
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; 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 |
Re: Performance TpFIBDataset
Seit wann gibt es ein stringgrid.Columns ?? Allgemein würde ich immer
SQL-Code:
benutzen, anstatt das bereits sichtbare zu durchsuchen.
where
|
Re: Performance TpFIBDataset
Zitat:
Zitat:
Prinzipiell geht meine Frage dahin, ob sich
Delphi-Quellcode:
performanter ausdrücken lässt, da es von der Laufzeit her wohl an dieser Stelle zu Engpässen kommt.
StringGrid.Cells[i, Dataset.RecNo] := Dataset.FindField(StringGrid.Columns[i].DataField);
|
Re: Performance TpFIBDataset
Ich kenne FIBPlus leider nicht, aber gibt es dort nicht evtl. ein Fields-Array, auf das Du direkt zugreifen könntest?
Delphi-Quellcode:
Oder etwas Ähnliches zumindest, da ich mir denken könnte, dass FindField intern mit einer Schleife arbeitet.
StringGrid.Cells[i, Dataset.RecNo] := Dataset.Fields[i];
|
Re: Performance TpFIBDataset
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! |
Re: Performance TpFIBDataset
Zitat:
Lasse doch mal hier das Stringgrid weg :
Delphi-Quellcode:
Es stellt sich schließlich die Frage, ob das zusammengebastelte Stringgrid schuld ist oder ein falsch zusammengebautes Dataset.
StringGrid.Cells[i, Dataset.RecNo] := Dataset.FindField(StringGrid.Columns[i].DataField);
|
Re: Performance TpFIBDataset
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.
|
Re: Performance TpFIBDataset
StringGrid scheint es gar nicht zu sein. Habe aus
Delphi-Quellcode:
mal folgendes gemacht:
StringGrid1.Cells[i, Dataset.RecNo] := Dataset.FieldByFieldNo(i).AsString;
Delphi-Quellcode:
Und die Laufzeiten bleiben identisch.
Dataset.FieldByFieldNo(i).AsString;
|
Re: Performance TpFIBDataset
Wenn das nicht dem Stringgrid zugewiesen wird, wem dann ? :shock: Mache doch einfach ein showmessage oder ein memo.lines.add.
|
Re: Performance TpFIBDataset
@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! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 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