Aufgabe mit Thread: unklare Bearbeitungszeiten



  • Hallo zusammen!

    Ich durchsuche mit meinem Programm eine Wordlist (Textdatei) nach Wörtern, die die gleiche Anzahl an Buchstaben des Wortes haben, das ich eingegeben habe (für ein Rätsel, wo man aus einem Buchstabensalat ein richtiges Wort formen muss).

    Jetzt verstehe ich die Zeiten (ich lass einen Timer laufen, der diese misst), die mein Programm braucht, um immer dieselbe Wordlist zu durchlaufen, nicht, wenn ich nur scheinbar klitzekleine Fitzel im Code ändere.

    Hier mal Beispiele:
    Mein Laptop (2GB Ram, DualCore) benötigt 98 Sekunden
    Mein Desktop-PC (8GB Ram, QuadCore) benötogt 96 Sekunden

    ...nur 2 Sekunden schneller?! Das ist mir schon schleierhaft, aber jetzt kommt erst der Super-GAU:

    Ich durchsuche die Textdatei ja in einem Thread, damit mein Programm während des Suchens nicht eingefroren wird. Wenn ich nun lediglich diese Zeile hier wieder einkommentiere (um dem Benutzer eine Vorstellung zu machen, wie lange das Ganze ungefähr dauert)...

    Synchronize(&GuiProgressBar); //im Thread, wird nach jeder Zeile (Wort) ausgeführt
    

    mit

    void __fastcall TMyThread::GuiProgressBar()
    {
      Form1->ProgressBar1->Position++;
    }
    

    ...braucht das Durchsuchen der Datei plötzlich mehrere tausend (!) Sekunden! Es liegt wirklich nur an dieser Zeile und ich kann mir nicht vorstellen, dass der Computer so viel länger braucht, nur weil er nach jedem Wort einmal die ProgressBar-Position um 1 erhöht.

    Hat da jemand einen Tipp? Braucht ihr vielleicht mehr Quellcode?



  • Mit dieser klitzekleinen Zeile veranlasst du deinen Thread sich jedes Mal mit der Hauptanwendung zu synchronisieren. Das kostet Zeit, sehr viel Zeit, wie du siehst. Unterteile die ProgressBar in 10 Schritte und führ die Zeile auch nur 10 Mal aus.

    Und wieso sollte das auf dem QC schneller sein, als auf dem DC, wenn du nur einen Thread verwendest? Die Menge des RAMs ist dabei zu vernachlässigen, weil du nicht mal annähernd auch nur die 2 GB im Laptop nutzt. Ein Geschwindigkeitsunterschied ergibt sich höchstens durch den Prozessor (Typ und Takt) und den RAM (ebenfalls Typ und Takt). Ich hoffe, du hast die Messungen zumindest im Final-Release gemacht...

    Gruß KK



  • Moin

    Killer-Kobold schrieb:

    Und wieso sollte das auf dem QC schneller sein, als auf dem DC

    Ja, hast recht. Hab mal ne Tabelle erstellt:

    Schritte___________Zeit
    %98
    1
    <ewig>
    10______________205
    100_____________112
    1000____________107

    Selbst nach tausender-Schritten wird die Dauer nur unnötig in die Länge gezogen. Ich glaub ich lass die ProgressBar dann einfach raus (vor allen Dingen, da ich die Textdatei sowieso schonmal einlesen musste, um die Zeilen zu zählen!).

    Danke und bis dann



  • Hallo

    Die ProgressBar kannst du schon drinnen lassen, nur solltest du sie nicht nach jedem einzelnen Schritt aktualisieren, wenn dein Prozess ein paar tausend Schritte pro Sekunde abarbeiten könnte. Las doch die Aktualisierung nur nach jedem 1000. Schritt oder so ausführen, dann ist der Zeitverlust akzeptabel.

    bis bald
    akari



  • Hi,
    ja, das mit den tausender-Schritten würde schon gut klappen. Wie schon gesagt muss ich beim Einlesen der Datei aber ersteinmal die Anzahl der Zeilen auslesen, um überhaupt die ProgressBar nutzen zu können. Da das auch ungefähr 30 Sekunden dauert, lass ichs einfach raus. Eine schnellere Variante gibts glaub ich auch nicht.

    Danke und bis dann!


Anmelden zum Antworten