Frage

Hier ist ein kleiner Test, den ich geschrieben habe, um zu verifizieren, dass die Zeit tatsächlich nur in Linux vorwärts läuft.

#include <time.h>
#include <sys/time.h>  

bool timeGoesForwardTest2()
{
   timeval tv1, tv2;   
   double startTime = getTimeSeconds();  // my function

   while ( getTimeSeconds() - startTime < 5 )
   {
      gettimeofday( &tv1, NULL );  
      gettimeofday( &tv2, NULL );  

      if ( tv2.tv_usec == tv1.tv_usec &&
           tv2.tv_sec == tv1.tv_sec )
      {
         continue;  // Equal times are allowed.
      }

      // tv2 should be greater than tv1
      if ( !( tv2.tv_usec>tv1.tv_usec ||
              tv2.tv_sec-1 == tv1.tv_sec ) )
      {
         printf( "tv1: %d %d\n", int( tv1.tv_sec ), int( tv1.tv_usec ) );
         printf( "tv2: %d %d\n", int( tv2.tv_sec ), int( tv2.tv_usec ) );
         return false;
      }         
   }
   return true;
}

Der Test schlägt mit dem Ergebnis fehl.

 tv1: 1296011067 632550
 tv2: 1296011067 632549

Ummm ....

Warum passiert das?

Hier ist mein Setup:

Linux version 2.6.35-22-generic (buildd@rothera) (gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu4) ) #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 (Ubuntu 2.6.35-22.33-generic 2.6.35.4)
... running inside VirtualBox 3.2.12, in Windows 7.
War es hilfreich?

Lösung

Da ist ein Öffnen Sie das Problem im VirtualBox -Fehler -Tracker. Sie verlinken zu einem Blog -Beitrag, der besagt, warum Sie sollten GetTimeofday nicht verwenden () Um den Zeitverlauf zu messen:

Die tragbarste Methode, um die Zeit richtig zu messen, scheint clock_getime zu sein (clock_monotonic, ...)

Andere Tipps

gettimeofday() ist nicht garantiert monoton. Verwenden clock_gettime(CLOCK_MONOTONIC) Wenn Sie diese Garantie benötigen.

Maschinen -Timer an den meisten Maschinen haben nur etwa 15 USEC -Präzision (sogar für nativen Code). Es ist seltsam, "rückwärts zu gehen", aber Sie können sich sowieso nicht auf dieses Level (1 USEC) verlassen. (Auch Hinweis: Es gibt einen Unterschied zwischen Präzision und Genauigkeit; die Genauigkeit der meisten Timer ist schlechter als ihre Präzision). Die Verwendung einer virtuellen Maschine kann dies auch verschlimmern.

Update: Tippfehler

Es ist nicht so, dass es rückwärts läuft. Es wäre besser zu sagen, dass es nicht die richtige Zeit meldet. Dies liegt daran, dass Computer ohne die Hilfe eines dedizierten Timing -Subsystems in einzelnen Millisekunden -Intervallen einfach nicht in der Lage sind, die Zeit sehr genau zu berichten.

Die Präzision variiert mit Hardware, Betriebssystem und sogar der Stromversorgung. Hier ist ein Artikel für Starter. Ein bisschen alt, kommuniziert aber die Idee gut.

Die Zeit sollte nicht auf echte Hardware rückwärts laufen. Auf einer VM kann Ihre Kilometerleistung variieren.

In jedem Fall sollte Ihre Bewerbung wahrscheinlich nicht davon ausgehen, dass die Zeit nicht um eine sehr geringe Menge zurückläuft (denken Sie vielleicht 1 Sekunde).

Ja, clock_getTime ist gut, aber selbst das könnte Führen Sie bei fehlerhafter Hardware (oder einer VM wie in Ihrem Beispiel) rückwärts.

Ich habe gesehen, wie ein Hardware -Fehler die Zeit rückwärts läuft (wenn auch sehr gelegentlich), es war eine Ursache für einige sehr besondere Probleme.

Insbesondere alles, was den Vergleich von Dateizeitstempeln mit dem Vergleich von Dateien beinhaltet, wird schief gehen, wenn die Zeit rückwärts läuft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top