ListView füllen und ProgressBar

  • Was mein reales Programm betrifft:

    Ich glaube sogar, dass es möglich sein müsste, noch zwei weitere Sekunden zu sparen.

    Grund: Ich hatte ja bereits in Posting Nr. 16 festgestellt, dass es zwei Sekunden länger dauert, die Datenbank per _SQLite_GetTable2d in ein 2D-Array einzulesen, gegenüber einem _SQLite_Query(), gefolgt von einer Schleife mit zeilenweisem Einlesen per _SQLite_FetchData() - was erprobterweise quasi in Nullzeit geschieht.

    Beim Versuch, das umzusetzen, habe ich heute leider richtig Schrott fabriziert. Aber wenn ich mich da erfolgreich durchgebissen habe, dann sollten zwischen F5 in SciTE und dem voll geladenen Programm, mit prall gefüllter und gefärbter ListView, nur noch schlanke drei Sekunden vergehen!

    Da ich die gleiche Routine auch für meine Suchfunktion verwende, würde der Vorteil also nicht nur den Programmstart betreffen, sonden auch den ständigen Gebrauch des Programms.

    Wenn das erledigt ist, dann ersetze ich außerdem noch das krötig lahme Sortieren über den Spaltenheader durch selfmade SQL-Sortierung, samt neuem Füllen der Listview. Dann ist alles kopmplett durch und durch richtig husch.

    Ich code, also bin ich!

  • Ich schmeiße mal meine jüngsten Erkenntnisse in die Runde.

    Diese sind leider nicht als der Weisheit letzter Schluss anzusehen, könnten die erfahreneren User aber dazu veranlassen, eigene Untersuchungen anzustellen, um womöglich unerwartetes Optimierungspotenzial zu erschließen.

    Es geht um die Frage: Auf welche Weise bekommt man eine ListView schneller gefüllt?

    a) _SQLite_Query(), plus einer While-Schleife mit _SQLite_FetchData()

    b) _SQLite_GetTable2d() plus _GUICtrlListView_AddArray()

    Die erfahrenen User waren ja der Meinung, Variante b) wäre schneller.

    Nun, nach meinen Tests ist die Sache so klar nicht ...

    Tatsächlich gewinnt bei mir Variante a), sofern die komplette Datenbank in die ListView fließen soll.

    Der Zeitunterschied fällt nicht gigantisch hoch aus, aber er beträgt bei mir (1400 Datensätze zu 32 Feldern) immerhin:

    a) 3047 ms

    b) 3614 ms

    Aber damit nicht genug, denn man bekommt die Variante a) noch rund doppelt schneller, indem man die übliche While-Schleife durch eine For-Next-Schleife ersetzt (mit ausreichend hohem Endwert), in der sich folgende If-Konstruktion befindet:

    if _SQLite_FetchData($hQuery, $aTaxi, False, False) = $SQLITE_OK Then

    Dann reduziert sich die Zeit für das Füllen der ListView sogar auf:

    1535 ms!

    Das ist also deutlich mehr als doppelt so schnell, wie Variante b).

    Dummerweise sieht die Sache aber anders aus, wenn nicht die komplette Datenbank eingelesen werden soll, sondern wenn das Query so gestrickt ist, dass es z. B. 1000 der 1400 Datensätze findet.

    In diesen Fällen gewinnt bei mir immer die Variante b).

    Ich kann mir gut vorstellen, dass wenn die geschätzten Power-User der Sache tiefer auf den Grund gehen, ein bislang unerwarteter Geschwindigkeitsschub für betroffene Anwendungen machbar ist.

    Ich code, also bin ich!

  • Hallo Code-Jack

    Das ist sehr interessant. Ich kann das jetzt nicht auf die Schnelle gegentesten. Allerdings nutze ich SQlite3 in einigen Programmen und werde da Optimierungen an den Schleifen testen. Ich bin gespannt. :)

    Aber damit nicht genug, denn man bekommt die Variante a) noch rund doppelt schneller, indem man die übliche While-Schleife durch eine For-Next-Schleife ersetzt (mit ausreichend hohem Endwert)

    Hierzu möchte ich nur darauf hinweisen, dass du die Anzahl der Einträge in der Tabelle schnell abfragen kannst:

    _SQLite_Query(-1, "SELECT COUNT(*) FROM tabellenname;", $hQuery)

    Grüße autoiter

  • Es geht um die Frage: Auf welche Weise bekommt man eine ListView schneller gefüllt?

    a) _SQLite_Query(), plus einer While-Schleife mit _SQLite_FetchData()

    b) _SQLite_GetTable2d() plus _GUICtrlListView_AddArray()

    Du meinst wohl...

    a) _SQLite_Query() in einer While-Schleife mit _SQLite_FetchData() plus _GUICtrlListView_AddArray()

    b) _SQLite_GetTable2d() plus _GUICtrlListView_AddArray()

    Anzahl der Zeilen/Spalten und Namen der Spalten holen und gewünschte Werte aus DB in Array kopieren für Anzeige im Listview.

  • Aber - öhh, sicherlich bin ich nur zu dumm - was genau soll Dein Quelltext aussagen?

    Damit wollte ich nur zeigen, wie ich die Daten aus einer SQLite-Tabelle auslese, um sie mit _GUICtrlListView_AddArray im Listview anzuzeigen, ohne _SQLite_GetTable/_SQLite_GetTable2d zu verwenden.