Funktionsweise der Timer Funktionen

  • Schönen guten Abend Community! =)
    Ich Rätsel und google schon einige Zeit, jedoch habe ich noch nichts Brauchbares gefunden. Es ist durchaus möglich dass ich einfach nur die falschen Schlagwörter verwende.

    Ich versuche herauszufinden wie die Timer Funktionen von AutoIt rechnen. Erst bin ich davon ausgegangen dass das Datum sowie Uhrzeit auf Millisekunden runter gerechnet wird. Jedoch stellte sich diese Vermutung als falsch heraus. Eine Sekunde erzeugt eine Differenz von ~2435923 im Timer Handle. Letztendlich ist das Handle ja nur eine Zahl mit der gerechnet wird...

    Hier ein kleines Beispiel:

    Spoiler anzeigen
    [autoit]

    For $i = 1 To 10

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

    $hTimer = TimerInit()

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

    Do
    Until TimerDiff($hTimer) >= 1000

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

    $hTemp = TimerInit()

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

    ConsoleWrite(@CRLF & _
    ' One: ' & $hTimer & @CRLF & _
    ' Two: ' & $hTemp & @CRLF & _
    ' --> ' & $hTemp - $hTimer & @CRLF & @CRLF)

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

    Next

    [/autoit]

    Ich frage mich nun natürlich warum eine so abstrakte Differenz entsteht...
    Ich hoffe ihr könnt mir dabei helfen Informationen dazu zusammen zu tragen.

    LG. Make :)

    Einmal editiert, zuletzt von Yjuq (22. November 2013 um 17:36)

  • Die TimerInit() und TimerDiff() - Funktionen arbeiten mit QueryPerformanceCounter und QueryPerformanceFrequency.
    Ich habe mir mal die TimerInit() und TimerDiff() im Quellcode der letzten Open-Source-Version von AutoIt angeschaut (ist glaube 3.1.0 o.Ä). Der AutoIt-Interpreter wird aber immernoch dieselbe Methode verwenden, denke ich.

    TimerInit() gibt einfach lpPerformanceCount (zu double konvertiert) zurück.
    Das sieht dann ungefähr so aus:

    Code
    __int64 now;
    
    
    QueryPerformanceCounter((LARGE_INTEGER *)&now)
    vResult = (double)now;

    TimerDiff() holt sich zunächst lpPerformanceCount & lpFrequency.
    Dann wird die Differenz mit dem Parameter (also dem "Handle" von TimerInit()) ausgerechnet.
    Das sieht ca. so aus:

    Code
    __int64 freq, now;
    
    
    QueryPerformanceFrequency((LARGE_INTEGER *)&freq)
    QueryPerformanceCounter((LARGE_INTEGER *)&now)
    
    
    vResult = (((double)now - vParam) / (double)freq) * 1000.0;  // vParam ist dabei der Parameter von TimerDiff(), also das "Handle"

    Hoffe ich hab dir weitergeholfen damit, fürs Rumprobieren/Rechnen warum da jetzt so eine Zahl rauskommt, hab ich leider keine Zeit :)

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • [autoit]


    $i = 0
    $F = DllCall("Kernel32.dll", "Int", "QueryPerformanceFrequency", "int64*", "")
    $S = DllCall("Kernel32.dll", "Int", "QueryPerformanceCounter", "int64*", "")
    While $i <> 10000000
    $i = $i + 1
    WEnd
    $E = DllCall("Kernel32.dll", "Int", "QueryPerformanceCounter", "int64*", "")
    MsgBox(0,"",($E[1] - $S[1]) / $F[1])

    [/autoit]

  • Das würde nicht funktionieren, da beide Funktionen einen Bool-Wert zurückgeben (schon oder?).
    Glaubst wozu der Parameter da ist. ;)

    Ich hab noch nie in AutoIt direkt mit DllCall's gearbeitet, ich wüsste deshalb nicht, wie ich einen (Pointer auf) LARGE_INTEGER mit DllCall übergeben könnte. Aber vielleicht weiß es ja einer der AutoIt-Veteranen hier. :D

    @MG: Du kannst es ja mal in C++ nachstellen. (schließlich hast damals meine Interesse an C++ geweckt :whistling: )

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

    Einmal editiert, zuletzt von PainTain (22. November 2013 um 17:29)

  • Ahh, okey :D
    Mir ist nun bekannt wie AutoIt intern die Zeit berechnet.
    Woher die DLL die Werte aber bezieht noch nicht.
    Aber wie BugFix sagte lässt sich ja jeder terminierte Zeitpunkt als Basis verwenden.
    Sollte so passen, was ich wissen wollte weiß ich jetzt.
    Danke an alle! :)

    [autoit]


    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #AutoIt3Wrapper_Version = B

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Global $tagLARGEINTEGER = 'DWORD LowPart;long HighPart'
    Global $tStruct = DllStructCreate($tagLARGEINTEGER)
    Global $tStruct1 = DllStructCreate($tagLARGEINTEGER)
    Global $tStruct2 = DllStructCreate($tagLARGEINTEGER)
    Global $pStruct = DllStructGetPtr($tStruct )
    Global $pStruct1 = DllStructGetPtr($tStruct1)
    Global $pStruct2 = DllStructGetPtr($tStruct2)
    Global $vTime

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    QueryPerformanceCounter($pStruct1)
    Sleep(2500)
    QueryPerformanceCounter($pStruct2)

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

    $vTime = $tStruct2.LowPart - $tStruct1.LowPart
    QueryPerformanceFrequency($pStruct)
    $vTime /= $tStruct.LowPart

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

    ConsoleWrite(@CRLF & ' ' & $vTime & @CRLF & @CRLF)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func QueryPerformanceCounter($pStruct)
    DllCall('Kernel32.dll', 'BOOL', 'QueryPerformanceCounter', 'ptr', $pStruct)
    EndFunc

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

    Func QueryPerformanceFrequency($pStruct)
    DllCall('Kernel32.dll', 'BOOL', 'QueryPerformanceFrequency', 'ptr', $pStruct)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    2 Mal editiert, zuletzt von Yjuq (22. November 2013 um 17:39)

  • PainTrain

    Welch mysteriöse Ergebnisse aber dabei rauskommen... Muss wohl Siegfried & Roy sein :D

    [autoit]


    $F = DllCall("Kernel32.dll", "Int", "QueryPerformanceFrequency", "int64*", "")
    $S = DllCall("Kernel32.dll", "Int", "QueryPerformanceCounter", "int64*", "")
    Sleep(2500)
    $E = DllCall("Kernel32.dll", "Int", "QueryPerformanceCounter", "int64*", "")
    MsgBox(0,"",($E[1] - $S[1]) / $F[1])

    [/autoit]


    ==> 2.4998351...

    Mit Sleep(10000) ==> 10.000295...