Wie genau ist die Zeitmessung mit CPU?



  • Hi community,
    Hab da mal ne Frage.
    Die Zeitmessung mit CPU, wie genau ist die?
    also zum Beispiel hier:

    #include <iostream>
    using namespace std;
    #include <time.h>
    #include <windows.h>
    #include <conio.h>
    int main()
    {
    
        int zahl;
        clock_t start, end;
        start = clock();
        Sleep(1000);
        end = clock();
    
        float millisekuden = end - start;  // stimmt das so überhautpt?!
        cout << "gemessene zeit = " << millisekuden << " millisekunden" << endl;
        float sekunden = millisekuden / 1000;
        cout << "Das sind " << sekunden << " Sekunden" << endl;
        getch();
        return 0;
    }
    

    Da kommt natürlich nicht genau 1 Sekunde raus, aber hat sicher auch mit der ungenauigkeit von Sleep zu tun...
    Naja...hat wahrscheinlich auch was mit der Hardware zu tun...
    Aber meine Frage: Ist diese Weise der Zeitmessung zuverlässig, auch wenns auf genaue angaben ankommt, oder kennt ihr noch ne bessere?

    thx
    mfg



  • Hallo,

    Ich weiss nicht wie genau clock() ist.
    Soviel ich weiss ist clock() von der CRT. Oder?

    Alternativen für Windows sind:
    - GetTickCount / Sleep (die Auflösung liegt bei beiden um die 15ms, die Auflösung kann mit GetSystemTimeAdjustment abgefragt werden.)
    - QueryPerformanceFrequency (hohe Auflösung)
    - Waitable Timers (hohe Auflösung)

    Alles sind Win32 API Funktionen.

    Grüsse
    Simon



  • Waitable Timers (hohe Auflösung)

    Sicher dass Waitable Timers eine höhere Auflösung haben als GetTickCount()? Würde mich auf jeden Fall wundern.
    Nur weil man das Timeout sehr hoch aufgelöst angeben kann heisst das ja noch lange nicht dass die Auflösung auch gut ist.



  • soweit ich jetzt mitbekommen habe, misst clock() die CPU-Zeit, also nicht direkt millisekunden

    für deinen Fall wär also gettimeofday() hilfreicher... wenn die Hardware mitmacht, liefert es sogar Genauigkeiten im µs-Bereich

    beispiel:

    #include <iostream>
    using namespace std;
    #include <sys/time.h>
    int main()
    {
      timeval start, end;
      gettimeofday(&start, 0);
      sleep(1); // oder sleep(1000) bei Windows
      gettimeofday(&end, 0);
      cout << start.tv_sec << ':' << start.tv_usec << endl;
      cout << end.tv_sec << ':' << end.tv_usec << endl;
    
      return 0;
    }
    

    sollte der Wert stimmen, den ich zurückbekommen habe, hat sleep(1) in meinem Fall eine Laufzeit von ca. 1,005 Sekunden



  • Sicher dass Waitable Timers eine höhere Auflösung haben als GetTickCount()? Würde mich auf jeden Fall wundern.
    Nur weil man das Timeout sehr hoch aufgelöst angeben kann heisst das ja noch lange nicht dass die Auflösung auch gut ist.

    Ja, ich denke, da hast Du recht. Die Auflösung ist wahrscheinlich nicht höher als die von GetTickCount(). Habs aber nicht gerade in der MSDN gefunden.

    Grüsse Simon



  • soweit ich jetzt mitbekommen habe, misst clock() die CPU-Zeit, also nicht direkt millisekunden

    Laut Standard misst clock() IIRC die vom eigenen Prozess verbrauchete CPU Zeit. Die Microsoft Implementierungen liefern allerdings einfach die verstrichene Zeit zurück.



  • hustbaer schrieb:

    Die Microsoft Implementierungen liefern allerdings einfach die verstrichene Zeit zurück.

    Und das ist zwar doof, man kann aber immerhin noch GetProcessTimes benutzen.



  • zwutz schrieb:

    soweit ich jetzt mitbekommen habe, misst clock() die CPU-Zeit, also nicht direkt millisekunden

    für deinen Fall wär also gettimeofday() hilfreicher... wenn die Hardware mitmacht, liefert es sogar Genauigkeiten im µs-Bereich

    beispiel:

    #include <iostream>
    using namespace std;
    #include <sys/time.h>
    int main()
    {
      timeval start, end;
      gettimeofday(&start, 0);
      sleep(1); // oder sleep(1000) bei Windows
      gettimeofday(&end, 0);
      cout << start.tv_sec << ':' << start.tv_usec << endl;
      cout << end.tv_sec << ':' << end.tv_usec << endl;
    
      return 0;
    }
    

    sollte der Wert stimmen, den ich zurückbekommen habe, hat sleep(1) in meinem Fall eine Laufzeit von ca. 1,005 Sekunden

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-195747-and-highlight-is-.html
    schau mal da^^ hatte ich schon Probiert, nutz aber NOCH windows^^
    werd aber jetz wahrscheinlich umsteigen...thx für die antworten


Anmelden zum Antworten