Delphi-PRAXiS
Seite 2 von 4     12 34      

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 ListView Performance bei vielen Datensätzen (FMX) (https://www.delphipraxis.net/215497-listview-performance-bei-vielen-datensaetzen-fmx.html)

fisipjm 16. Jul 2024 12:27

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Zitat:

Zitat von TurboMagic (Beitrag 1538929)
Ja, das wäre eine Untersuchung wert: wo ist das Bottleneck?
Laden aus der DB oder Einfügen in das Listview?
Ich gehe auch davon aus, dass die where Begingung des Selects
einen passenden Index in der DB nutzen kann?

Das "Bottleneck" ist 2 geteilt. Wie gesagt, das öffnen der Query ist nicht das Problem. Die Ist zu diesem Zeitpunkt schon lange offen. Das einzige was ich noch mache ist ein Query.first das geht unter 1ms.
Was "lange" braucht ist
Delphi-Quellcode:
while not Query.Eof do
        begin
          lListViewItem := ListView.Items.Add;
          lListViewItem.Objects.FindObjectT<TListItemText>('Field1').Text := lField1.AsString;
          lListViewItem.Objects.FindObjectT<TListItemText>('Field2').Text := lField2.AsString;
          lListViewItem.Objects.FindObjectT<TListItemText>('Field3').Text := lField3.AsString;
          lListViewItem.Objects.FindObjectT<TListItemText>('Field4').Text := lField4.AsString;
          lListViewItem.Tag := Query.RecNo;
          Query.Next;
        end;
Diese Funktion braucht für 138902 Datensätze 2309 ms zum einfügen in die Listview. Das sind 60 Einträge pro ms. Deshalb "langsam" in Anführungszeichen.

Der 2. Aufruf der "Lange" dauert ist das Anzeigen der Listview, also das setzen von Listview.Visible = true. Das dauert 907 ms. Auch hier ist deshalb langsam in Anführungszeichen geschrieben.

Nochmal zum Thema SQL. Die Query ist bereits geöffnet (Filter werden direkt nach der Anmeldung gesetzt und öffnen wird im Hintergrund durchgeführt) , also keine Möglichkeit hier sehr sicher keine Optimierung zu erreichen.

dummzeuch 16. Jul 2024 12:37

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Zitat:

Zitat von fisipjm (Beitrag 1538933)
Diese Funktion braucht für 138902 Datensätze 2309 ms zum einfügen in die Listview. Das sind 60 Einträge pro ms. Deshalb "langsam" in Anführungszeichen.

Ich würde das zum Timing mal auseinandernehmen:
1. Lesen aus der Query (in lokale Dummy-Veriablen)
2. Schreiben (von Dummy-Werten) in das Listview, so viele, wie die Query Einträge hat

Danach weißt, du, wie hoch der Anteil der jeweiligen Funktionalität ist. Darauf basierend kann man dann nach weiterer Optimierung suchen.

Papaschlumpf73 16. Jul 2024 13:00

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Von dem FMX-Dingern hab ich keine Ahnung. Aber kann man sich die 4 Spalten nicht vorab irgendwie merken, statt sie bei jedem Datensatz mit FindObjectT... neu zu suchen?

dummzeuch 16. Jul 2024 13:28

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1538937)
Von dem FMX-Dingern hab ich keine Ahnung. Aber kann man sich die 4 Spalten nicht vorab irgendwie merken, statt sie bei jedem Datensatz mit FindObjectT... neu zu suchen?

Nein, denn es sind ja jeweils Objekte in einem gerade neu erzeugten lListViewItem.

Papaschlumpf73 16. Jul 2024 13:53

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Zitat:

Zitat von dummzeuch (Beitrag 1538938)
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1538937)
Von dem FMX-Dingern hab ich keine Ahnung. Aber kann man sich die 4 Spalten nicht vorab irgendwie merken, statt sie bei jedem Datensatz mit FindObjectT... neu zu suchen?

Nein, denn es sind ja jeweils Objekte in einem gerade neu erzeugten lListViewItem.

Jetzt, wo du es sagst, sehe ich es auch :-)

perpeto1234 16. Jul 2024 14:35

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Wäre hier nicht ein TListView im "Virtualmode" sinnvoll?
https://docwiki.embarcadero.com/Libr...View.OwnerData

Papaschlumpf73 16. Jul 2024 14:42

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Zitat:

Zitat von perpeto1234 (Beitrag 1538942)
Wäre hier nicht ein TListView im "Virtualmode" sinnvoll?
https://docwiki.embarcadero.com/Libr...View.OwnerData

Das wäre perfekt - leider wird hier FMX gebraucht.

fisipjm 16. Jul 2024 14:48

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1538943)
Zitat:

Zitat von perpeto1234 (Beitrag 1538942)
Wäre hier nicht ein TListView im "Virtualmode" sinnvoll?
https://docwiki.embarcadero.com/Libr...View.OwnerData

Das wäre perfekt - leider wird hier FMX gebraucht.

Ich finde es aber beruhigend das ihr auch über die gleichen Möglichkeiten stolpert wie ich :-D

fisipjm 16. Jul 2024 15:25

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Zitat:

Zitat von dummzeuch (Beitrag 1538935)
Zitat:

Zitat von fisipjm (Beitrag 1538933)
Diese Funktion braucht für 138902 Datensätze 2309 ms zum einfügen in die Listview. Das sind 60 Einträge pro ms. Deshalb "langsam" in Anführungszeichen.

Ich würde das zum Timing mal auseinandernehmen:
1. Lesen aus der Query (in lokale Dummy-Veriablen)
2. Schreiben (von Dummy-Werten) in das Listview, so viele, wie die Query Einträge hat

Danach weißt, du, wie hoch der Anteil der jeweiligen Funktionalität ist. Darauf basierend kann man dann nach weiterer Optimierung suchen.

Also, hab das jetzt noch weiter Auseinander genommen.
Laden der Daten in 3 unterschiedliche TArray<String> Variablen - 620 ms
Laden des Arrays in die Listview mit "add" befehl - 1611 ms
Umstellen auf Visible=true - 1140 ms

Zusammen 3371 ms
Am meisten "stören" tatsächlich die 1140 ms im Visible:=true teil, weil da auch die Ladeanimation hängt. :-/

Papaschlumpf73 16. Jul 2024 15:45

AW: ListView Performance bei vielen Datensätzen (FMX)
 
Chat-GPT glaubt, dass es auch beim FMX-ListView einen VirtualMode gibt: ListView1.OnUpdateObjects
Wenn das stimmt (wie schon erwähnt, hab ich keine Ahnung von FMX), könnten 2 der 3 Prozesse extrem beschleunigt werden. Selbst das Visible:=true wäre dann extrem schnell.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.
Seite 2 von 4     12 34      

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-2025 by Thomas Breitkreuz