Hallo liebe Community,
ich habe mich entschlossen, diese Zeilen hier zu schreiben, weil ich Stunden auf der Suche nach einem Fehler verbracht habe und davon gerne erzählen möchte.
Das allseits beliebte GUICtrlCreateListViewItem!
Ich habe einige Zeit in Foren verbracht, in denen verschiedenste Methoden ausdiskutiert wurden, wie man nun "GUICtrlCreateListViewItem" schneller hinbekommt. Oft genug wurde es mir zu kompliziert und womöglich war es auch gar nicht das Problem das ich hatte.
Mein Problem war eine Datenbank mit etwa 4400 Einträgen in einem Listview, erstellt mit GUICtrlCreateListViewItem in einer FOR-Schleife. Sobald in einem Input-Feld ein Buchstabe eingegeben wurde, wurde mit einer gleichen FOR-Schleife das Listview geleert und neu befüllt in dem das Item erstellt wird, wenn die Bedingung erfüllt ist (Update-Funktion).
Das Eingeben eines Buchstaben reduzierte die Datenbankausgabe auf 3200 Einträge und dauerte 6000ms. 6 Sekunden waren mir zu lang. Daraufhin Foren durchgestöbert und einige Varianten getestet: _GUICtrlListView_AddItem und _GUICtrlListView_AddArray, beides mit Geschwindigkeitserfolg, auch $SW_HIDE und _GUICtrlListView_BeginUpdate haben zum Erfolg geführt, aber waren immer noch viel zu langsam.
Denn beim Testen ist dann aufgefallen: beim Starten meines Programms wird das Listview auch schon gefüllt und es dauerte nur 70ms (!) mit mehr Einträgen.
Daraufhin habe ich die Update-Funktion mal an anderen Stellen gepackt und dabei entdeckt: NACH GuiSetState() (also nach dem ganze GUI) 6000ms -> VOR GuiSetState 70ms !!!
Mit anderen Worten der Geschwindigkeitsverlust kommt NUR durch das GUI. Selbst wenn ich die Liste vor dem Updaten nicht gelöscht habe ist es etwas über 6000ms gegangen (knapp doppelte Menge, also knapp 70ms mehr als vorher).
Und jetzt kommt es. Der Hauptübeltäter war ein GUICtrlCreateGroup das den Listview einrahmte.
mit GUICtrlCreateGroup = 6000ms
ohne GUICtrlCreateGroup = 1400ms
Daraufhin jedes GUICtrlCreateGroup rausgenommen: trotzdem nur 1400ms
GUICtrlCreateGroup wieder hinzugenommen:
1. Start 4300ms
2. Start 5000ms
danach wieder 6000ms nach jedem Start.
Und nu würde ich gerne von den Profis wissen, WARUM ist das so?
Ich habe versucht es in einem Testprogramm zu reproduzieren, aber es reicht nicht nur eine Group hinzuzufügen, es müssen wohl weit mehr Elemente sein. Denn auch die 1400ms sind ja nicht das Beste.
Für die, die sich durch die Textwüste gekämpft haben:
um auf die 70ms wiederzukommen muss man das GUI-Listview Element löschen und wieder neu erstellen. Natürlich sind die 70ms nur das Füllen vom Listview....löschen vom GUI-Element oder das Leeren vom Listview kostet natürlich auch Zeit.
Vielen Dank fürs Durchlesen.