Plattformunabhängige Zeitmessung in ms



  • Plattformunabhängige Zeitmessung in ms ist gar nicht so einfach zu implementieren:

    // Different libraries for time management
    #ifdef _WIN32
    # include <sys/timeb.h>  // _ftime()
    #else
    # include <sys/time.h>  // gettimeofday()
    #endif
    
    // Returns the system time in milliseconds
    inline uint64_t SystemTime() {
    #ifdef _WIN32
      _timeb t;
      _ftime(&t);
      return static_cast<uint64_t>(t.time) * 1000ULL + t.millitm;
    #else
      timeval t;
      gettimeofday(&t, NULL);
      return static_cast<uint64_t>(t.tv_sec) * 1000ULL + t.tv_usec / 1000;
    #endif
    }
    

    Ich bin mir nicht sicher, ob der Code so optimal ist. Gibt es eine andere Möglichkeit die Zeit in ms via Standard-Library zu messen?


  • Mod

    Tomahawk schrieb:

    Gibt es eine andere Möglichkeit die Zeit in ms via Standard-Library zu messen?

    Nur im Rahmen der dir wohl bekannten Funktionen aus time.h, die prinzipiell Milisekunden genau sein dürften, aber in der Regel nicht sind.

    Milisekundengenau Messung klingt eher nach Performancemessung als nach Datumsmessung. Willst du nicht eher die CPU-Zeit anstatt der wall clock time messen? Dann hättest du sogar in der Standardbibliothek clock() zur Verfügung, welches meistens (aber auch nicht garantiert 😞 ) auf µs genau ist. Im Reich der betriebssystemabhängigen Funktionen hättest du dann sogar Funktionen mit garantierter Auflösung in dieser Größenordnung (oder sogar bis hinunter zu ns) zur Verfügung.



  • SeppJ schrieb:

    Tomahawk schrieb:

    Gibt es eine andere Möglichkeit die Zeit in ms via Standard-Library zu messen?

    Nur im Rahmen der dir wohl bekannten Funktionen aus time.h, die prinzipiell Milisekunden genau sein dürften, aber in der Regel nicht sind.

    Milisekundengenau Messung klingt eher nach Performancemessung als nach Datumsmessung. Willst du nicht eher die CPU-Zeit anstatt der wall clock time messen? Dann hättest du sogar in der Standardbibliothek clock() zur Verfügung, welches meistens (aber auch nicht garantiert 😞 ) auf µs genau ist. Im Reich der betriebssystemabhängigen Funktionen hättest du dann sogar Funktionen mit garantierter Auflösung in dieser Größenordnung (oder sogar bis hinunter zu ns) zur Verfügung.

    Es geht hierbei um die tatsächlich verstrichene Zeit in ms für interne Schachuhren (das UniversalChessInterface Protokoll schreibt die Angabe in ms vor). Betriebssystemabhängige Funktionen wollte ich weitestgehend meiden und mich am Standard entlanghangeln.


  • Mod

    Tja, wenn tatsächlich solch genaue Echtzeit gefragt ist, muss wohl wirklich das OS ran. Da kann man nichts machen. Die Standardbibliothek kann dir die gewünschten Garantien nicht portabel geben (und die gängigen Implementierungen leisten die Anforderungen auch tatsächlich nicht).

    Da du aber sicherlich Zeitunterschiede messen möchtest, musst du aufpassen, dass du eine Systemuhr wählst, die zwar physische Zeit misst, aber nicht umgestellt werden kann. Sonst bekommst du Probleme bei Winter-/Sommerzeit, oder, realistischer, wenn der Computer die Systemuhr mit einem Zeitserver synchronisiert. Uhren mit diesen Anforderungen gibt es aber auch in allen gängigen Systemen (eben weil deine Anforderung nicht so ungewöhnlich ist), aber wie sie heißen, darfst du selber nachgucken.



  • Die Manpage von clock_gettime ist hier möglicherweise ganz aufschlussreich.


Anmelden zum Antworten