Merkwürdige Meßergebnisse mit _Timer_Init() und _Timer_Diff()

  • Moin,

    wegen Alinas Beitrag habe ich probiert, die darin enthaltene Sortierfunktion _Sort() von Dictionary auf Map() (_SortMap()) umzustellen. Das ist auch gelungen und die Laufzeitunterschiede sind beträchtlich. Während das Dictionary hier um die 50 ms läuft, braucht die Map() nur rund 10 ms.

    Wenn nur eine der Funktionen aufgerufenb wird, sind diese Ergebnisse stabil. Rufe ich aber _Sort und _SortMap mit identischen Eingaben nacheinander auf, wird für die zweite Routine eine vile zu lange Laufzeit gemessen. Erst ein zwischengeschobener Sleep() von 512 ms oder besser mehr bringt wieder halbwegs glaubhafte Ergebnisse. Kann mir jemand sagen, warum das so ist?

    Für den Test habe ich Alinas String in eine Textdatei ausgelagert. Sie ist beigefügt => Test.txt

  • 4 Hinweise:

    1. AutoIt führt Zeilen beim ersten Mal etwas langsamer aus (außer das wurde inzwischen geändert). Das heißt wenn du eine Funktion das erste Mal aufrufst ist sie langsamer als alle weiteren Male. Was dich eigentlich interessiert ist die durchschnittliche Geschwindigkeit mit der die Funktion läuft, und nicht die Zeit die sie beim ersten Mal braucht.

    2. Je nachdem was dein PC gerade macht (der macht immer irgendetwas, z.B. Windows laufen lassen, Festplatte lesen, etc.) läuft AutoIt manchmal sehr unterschiedlich schnell (es "ruckelt" dann im Interpreter). Einzelne Messergebnisse sind also nicht aussagekräftig.

    3. (klingt komisch, ist aber so): Die Reihenfolge in der Code aufgerufen wird bewirkt einen kleinen Geschwindigkeitsunterschied (manchmal vernachlässigbar klein, manchmal größer, ich habe leider kein Beispiel, das ist nur eine Beobachtung von mir als ich ziemlich viele Funktionen auf Geschwindigkeit überprüft habe).

    4. Seit Windows 10 Update XYZ (ich weiß nicht welches) ist das ausführen von PostMessageA extrem verlangsamt (wird Intern im Interpreter verwendet). Der Interpreter wird langsamer, falls vorher schonmal ein Windows-Fenster erzeugt wurde (z.B. ArrayDisplay, MsgBox, etc). Das wurde zwar in AutoIt "gefixt" (indem nur noch alle X Interpreterschritte PostMessageA aufgerufen wird), hat aber trotzdem eine kleine Auswirkung. Daher: Verwende beim Zeitmessen niemals irgendwelche Fenster als Ausgabe, sondern lieber die Konsole.

    Am Besten ist es, wenn du beide Funktionen in zufälliger Reihenfolge aufrufst und die Messwerte z.B. in ein Array mit N Einträgen einträgst. Der Median davon entspricht in etwa dem durchschnittlichen Messwert. (Median deshalb, damit Ausreißer abgefangen werden, ein einfacher Mittelwert kann durch einen einzigen "ruckler" komplett kaputtgemacht werden).

    PS: Ich habe das Skript nicht getestet, sondern nur kurz angeschaut.

    lg

    M

  • Moin Mars,

    vielen Dank für Deine Antwort. Ich habe das jetzt als 'erledigt' markiert.

    Es ist schon ein Weilchen her, dass ich intensiver 'gebenchmarkt' habe, und das war auch nicht mit AutoIt. Microsoft trickst ja schon immer herum, um die Windows-Oberfläche schneller bzw. reaktionsfreudiger erscheinen zu lassen. Ich gehe jetzt mal davon aus, dass sich die 'Strafen' für den Wechsel in den Vordergrund und wieder zurück im Laufe der Jahre immer mehr auswirken, zumal ja auch immer mehr Prozesse/Threads parallel laufen. Wenn man nach der Rückkehr aus dem Vordergrund nicht gerade eine 'hochpräzise' Zeitmessung als Benchmarkgrundlage ausführt, merkt man das nicht. Man könnte das wohl nur umschiffen, wenn man für die Messung auf die tatsächlich vom Thread genutzte CPU-Zeit zurückgreift.