Genaue Zeitmessung in C



  • Hallo Freunde,

    ich möchte die Zeit, die ein Vorgang in Anspruch nimmt ,möglichst genau messen, so auf us genau.

    Mit der Funktion gettimeofday aus time.h funktioniert das auch ganz gut auf meinem Linuxrechner. Das Problem ist, dass ich den C-Code auf einem Windowsrechner laufen lassen muss.

    Wenn ich die Funktion gettimeofday aber auf meinem Windowsrechner laufen lasse, kommt nichts Schlaues heraus. Sobald ich unter 1000us falle, wird mir einfach 0 auf die Konsole ausgegeben.

    Ich habe schon versucht, die Zeit zu bestimmen, indem ich die Anzahl tics bestimme, aber da ist die Auflösung auch nicht wirklich gut.

    Weiss jemand von euch, ob es eine äquivalente Funktion von gettimeofday für Windows gibt?

    Oder hat jemand vielleicht eine bessere Idee um die Zeit genau zu bestimmen?

    Hier ist mein C-code mit gettimeofday. Wie gesagt, unter Linux funktioniert das gut, unter Windows oberhalb von 1000us auch ok, unter 1000us, funktioniert nicht mehr:

    #include <time.h>
    #include <sys/time.h>
    #include <stdio.h>
    #include <unistd.h>
    
    void main()
    {
    
        int i;
        struct timeval t0, t1;
    
        gettimeofday(&t0, 0);
    
        //Schlaufe zum Verzoegern
        for(i=1; i<24000; i++)
        {
    
            //...//
        }
    
        gettimeofday(&t1, 0);
        long elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec;
    
        printf("mit gettimeofDay: %d\n", elapsed);
    }
    

    Vielen Dank für eure Hilfe,
    Ann



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • - QueryPerformanceFrequency/QueryPerformanceCounter
    - GetTickCount (Auflösung ca. 16ms)
    - GetSystemTimeAsFileTime (Auflösung ca. 100ns)



  • Hallo Wutz,

    Vielen Dank für deine Antwort, dann werde ich mir GetSystemTimeAsFileTime anschauen. 100ns tönt schon mal sehr ansprechend.

    Viele Grüsse
    Annn



  • Stimmt aber leider nicht, GetSystemTimeAsFileTime ist auch nicht genauer als GetTickCount.



  • Hallo hustbaer,

    Danke, für deine Antwort. Ja, das wurde mir soeben auch bewust. Eigentlich komisch, denn auf der API- steht ja, dass tatsächlich 100ns Blöcke gemessen werden.

    Ich habe hier noch was anderes gefunden:

    http://www.refcode.net/2013/02/gettimeofday-for-windows_13.html

    was denkt ihr davon? Um ehrlich zu sein verstehe ich den Code nicht ganz.

    Es muss doch auch mit Windows möglich sein die Zeit genau zu messen...

    Vielen Dank
    Annn


  • Mod

    Annn schrieb:

    Es muss doch auch mit Windows möglich sein die Zeit genau zu messen...

    Willst du wirklich die Uhrzeit so genau messen? 😕 So genau ist keine Computeruhr gestellt. Oder eher Zeitabstände? Dafür hast du doch schon Antworten bekommen. Bitte vollständig lesen:

    Wutz schrieb:

    • QueryPerformanceFrequency/QueryPerformanceCounter
      - GetTickCount (Auflösung ca. 16ms)
      - GetSystemTimeAsFileTime (Auflösung ca. 100ns)


  • Hallo, auch danke an dich. Nein, die Uhrzeit ist mir eigentlich egal, ich möchte nur Zeitabstände messen.

    Aber wie hustbaer schon gesagt hat, ist auch GetSystemTimeAsFileTime nicht wirklich genau... Ich kriege da keine Auflösung von 100ns hin...

    Vielleicht mache ich aber auch etwas falsch. Würdest du sagen, mit GetSystemTimeAsFileTime kriege ich eine Genauigkeit von einigen us für Zeitabstände hin?

    Danke, Annn



  • Wenn du (kurze) Zeitabstände messen willst, dann nimm QueryPerformanceCounter. Wurde jetzt doch schon mehrfach geschrieben 😕



  • Hallo, ja dann wird mir wohl nicht viel anderes übrig bleiben. Aber:

    http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q274323&

    Deshalb zögere ich ein bisschen.

    Annn



  • Zähle doch die CPU-Ticks, da ist das OS dann egal.



  • CPU Ticks zählen... Ist das nicht ein bisschen gefährlich bzw. unzuverlässig auf Multicore und Multithreading Systemen?! Könnt ja Gott weiß was für ein anderer Prozess dazwischen kommen...


Anmelden zum Antworten