Problem bei der Zeitmessung

  • Hallo zusammen,

    erstmals ein frohes neues Jahr an die Gemeinde :rolleyes:

    Beim Versuch die Zugriffszeiten an verschiedene Programe zu messen stellte ich fest, dass beim Ausführen eine einfachen Sleeps ich unterschiedliche Laufzeiten auf verschiedenen Rechnern bekomme ?(

    Allein ein einfaches Script wie

    [autoit]


    $begin = TimerInit()
    Sleep(5000)
    MsgBox(0, "Timer", "Laufzeit = "& TimerDiff($begin))

    [/autoit]

    liefert auf einem PC mit Pentium, 4CPUs, 3GHz eine Laufzeit von 4999 ms, jedoch auf einem Intel Core2 Duo,E8400 ,3 Ghz nur noch 209 ms.

    Ich habe AutoIt auf dem Rechner installiert, da ich dachte, es müßte dort Compiliert werden, brachte leider auch nichts :(

    Jetzt bin ich ratlos...

    Grüsse
    Paul

    Einmal editiert, zuletzt von yupepa (2. August 2012 um 13:27)

  • Keiner dieser beiden Werte können mit dem von dir geposten Code erzeugt worden sein, da das sleep(5000) das Script bereits um 5000ms "verlangsamt".

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Doch doch das kann schon sein und ist bei mir auch reproduzierbar.
    Sowohl die Zeitmessung mit TimerInit/Diff als auch die Wartezeit per Sleep() sind nicht exakt und Ungenauigkeiten auf beiden Seiten können durchaus zu Werten <5000 führen. (bei mir z.B. 4987ms).
    Für wirklich fehlerhaft halte ich allerdings den 2. Wert von 209ms.
    Eine Erklärung kann ich dafür auch nicht anbieten.

  • Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    $GUi = GUICreate("TimerTest",210,30)
    $Tinput = GUICtrlCreateInput("",5,5,200,20)
    GUISetState()
    $Timer = TimerInit()
    While TimerDiff($Timer) <=6000
    GUICtrlSetData($Tinput,TimerDiff($Timer))
    WEnd
    MsgBox(1,"Fertig","")

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    kommt dort auch der selbe Fehler?

    Gruß Marvin

  • Das das Script von Protex deine CPU und deine Rechner gewaltig auslastet *lach*.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hat den keiner eine brauchbare Idee ?????

    Ich habe es noch mit einem DOS Program sleep.exe ausprobiert, auf der CMD ist es normal gelaufen, wogegen mit ShellExecuteWait ist es auch nur einen Bruchteil der Zeit gelaufen.

  • Oder machs halt manuell. Sprich vor dem starten des Programmes mit den Markos die aktuelle Zeit auslesen:

    [autoit]

    @YEAR @MON @MDAY @HOUR @MIN @SEC @MSEC

    [/autoit]

    und nach dem beenden nochmal und die Differenz dann berechnen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • _HighPrecisionSleep() liefert das gleiche Ergebniss, ich nehme mittlerweile an das es an dem E8400 Prozessor liegt, Test mit anderen Rechnern mit gleichem Prozessor ergaben ähnliche Ergebnisse.

    chip: Ich verwende Sleep für kurze Wartezeiten, 0,5s - 2s um dem ausgeführtem Program etwas Zeit zu lassen, da es sonst nicht vernünftig reagiert, mauelle Messung würde zu viel Zeit dauern.

    Dann muss ich wohl die Sleepzeit schätzen damit ich in etwa hinkomme, für andere Ideen bin ich weiterhin dankbar.

  • hallo,

    es hat zwar etwas gedauert, aber ich habe das Problem eingekreist und anderweitig, für mich zufriedenstellend, gelöst.

    Das Problem liegt in der zugrundeliegenden Funktion QueryPerformanceCounter und QueryPerformaceFrequency. Es gibt auch eine Blog zu dem Thema:

    http://www.virtualdub.org/blog/pivot/entry.php?id=106

    Da ich keine hohe Genauigkeit bei der Zeitmessung benötige, verwende ich statt dessen die Funktion timeGetTime, diese hat eine Genauigkeit von 10ms.

    Spoiler anzeigen


    $begin = f_timeGetTime()
    Sleep(1234)
    $end = f_timeGetTime()
    $diff = $end - $begin
    MsgBox(0, "Timer1", "Diff = "&$diff)

    Func f_timeGetTime()
    Local $aResult = DllCall("winmm.dll", "long", "timeGetTime")
    If @error Then Return SetError(@error, @extended, -1)
    Return $aResult[0]
    EndFunc ;==>f_timeGetTime

  • Übriegens kommen bei mir bei diesem Script

    [autoit]

    $begin = TimerInit()
    Sleep(5000)
    MsgBox(0, "Timer", "Laufzeit = "& TimerDiff($begin))

    [/autoit]

    5003 ms raus.

  • Ich habe ja gesagt es handelt sich um ein Problem zur bestimmten Hardware, wahrscheinlich Processor und wie es aussieht ziemlich selten.

  • Es liegt an der CPU selbst, angeblich (noch nicht getestet) liegt es daran das Timerinit() mit Ticks arbeitet die bei jeder CPU unterschiedlich sind. Wenn man jetzt seine CPU unter / übertaktet, kann es zu einem Fehler in der Berechnung kommen (zu niedrig / zu hoch). Kann man auch beobachten das bei solchen Systemen die Uhrzeit verkehrt läuft (zu langsam / zu schnell).

    Das deckt sich auch mit meinen Erfahrungen. Man könnte es ausprobieren in dem man die CPU leicht unter / übertaktet und einen Mittelwert(vorher / nachher) von 10 Durchläufen vergleicht.

    Diese Information hatte ich hier auf Autoit.de gefunden, allerdings finde ich es grade nicht mehr.

    Schöne Grüße
    Jason

  • Es liegt an der CPU selbst, angeblich (noch nicht getestet) liegt es daran das Timerinit() mit Ticks arbeitet die bei jeder CPU unterschiedlich sind. Wenn man jetzt seine CPU unter / übertaktet, kann es zu einem Fehler in der Berechnung kommen (zu niedrig / zu hoch). Kann man auch beobachten das bei solchen Systemen die Uhrzeit verkehrt läuft (zu langsam / zu schnell).

    Bei meinen Rechner ist die CPU grundsätzlich übertaktet. Aber das da die Uhrzeit verkehrt läuft hab ich noch nie erlebt O.o

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Es liegt an der CPU selbst, angeblich (noch nicht getestet) liegt es daran das Timerinit() mit Ticks arbeitet die bei jeder CPU unterschiedlich sind. Wenn man jetzt seine CPU unter / übertaktet, kann es zu einem Fehler in der Berechnung kommen (zu niedrig / zu hoch). Kann man auch beobachten das bei solchen Systemen die Uhrzeit verkehrt läuft (zu langsam / zu schnell).

    Da ist auch das was im obigem Link erwähnt wird

  • Zitat

    Bei meinen Rechner ist die CPU grundsätzlich übertaktet. Aber das da die Uhrzeit verkehrt läuft hab ich noch nie erlebt O.o


    Ich glaube es geht darum, dass die CPU ihre Taktfrequenz anpasst und die Zeitmessungsfunktion die in AutoIt verwendet wird dafür nicht kompensiert. Meine CPU hat je nach Auslastung einen Takt von 1,6GHz oder 4,0GHz. Fast alle der neuen Intel CPUs haben diese neue TurboBoost Funktion mit der der Takt während des OS Betriebs geändert werden kann.