Time



  • Bisher arbeite ich mit Function A, um Laufzeiten in Millisekunden zu messen. Weshalb findet man im Internet häufig Implementierungen ähnlich wie Function B?

    Function A:

    inline int get_process_time() {
      return static_cast<int> (clock());
    }
    

    Function B:

    inline int get_system_time() {
    #if defined(_MSC_VER)
        struct _timeb t;
        _ftime(&t);
        return int(t.time*1000 + t.millitm);
    #else
        struct timeval t;
        gettimeofday(&t, NULL);
        return t.tv_sec*1000 + t.tv_usec/1000;
    #endif
    }
    


  • Folgende unvollständige Implementierung ist auch oft zu finden:

    inline int get_time() {
    #if defined(_WIN32) || defined(_WIN64)
      return GetTickCount() / 1000.0;
    #else
      // ???
    #endif  // _WIN32 || _WIN64
    

    Ich benötige eine plattformübergreifende Lösung mit einer Genauigkeit von +-10ms.



  • Meines Erachtens tun die beiden Funktionen etwas völlig Unterschiedliches. Funktion A liefert die vom Prozess verwendete Prozessorzeit, während Funktion B die tatsächliche Systemzeit zurückgibt.

    Anders ausgedrückt: Funktion B verwendet eine Uhr, die weiterläuft, wenn das Programm gerade nicht rechnet, während die Uhr, die in Funktion A verwendet wird, nur läuft, wenn das Programm auch tatsächlich gerade ausgeführt wird.



  • Tomahawk schrieb:

    Bisher arbeite ich mit Function A, um Laufzeiten in Millisekunden zu messen. Weshalb findet man im Internet häufig Implementierungen ähnlich wie Function B?

    Function A:

    inline int get_process_time() {
      return static_cast<int> (clock());
    }
    

    Schrott. Zumindest auf Forumssicht. Ist C++ Kram.
    Es gibt die ANSI C Funktion

    #include <time.h> clock_t clock(void);
    

    welche die Zeitschritte in der Auflösung des Systemzeitgebers zurückgibt,
    durch eine Division mit CLOCKS_PER_SEC ergeben sich die Sekunden.
    Normalerweise entspricht clock_t => long, d.h. dein Downcast zu int führt u.U. zu sinnlosen Ergebnissen.
    Mit clock() bist du maximal portabel und benötigst keine ifdefs o.ä.


Log in to reply