Question

Voici un petit test, je l'ai écrit pour vérifier que le temps ne fait que courir vers l'avant dans Linux.

#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;
}

test échoue avec le résultat.

 tv1: 1296011067 632550
 tv2: 1296011067 632549

hummm ....

Pourquoi cela?

Voici ma configuration:

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.
Était-ce utile?

La solution

Il y a un question ouverte à la Bug Tracker VirtualBox. Ils contiennent un lien vers un blog indiquant pourquoi vous ne devriez pas utiliser gettimeofday () pour mesurer le passage du temps:

La façon la plus portable pour mesurer le temps semble bien être clock_gettime (CLOCK_MONOTONIC, ...)

Autres conseils

gettimeofday() n'est pas garanti d'être monotones. Utilisez clock_gettime(CLOCK_MONOTONIC) si vous avez besoin de cette garantie.

minuteries de la machine sur la plupart des machines ont seulement 15 précision USEC (même code natif). Le temps passe « en arrière » est bizarre, mais vous ne pouvez vraiment pas compter sur ce niveau (1 microseconde) de toute façon. (A noter également: il y a une différence entre la précision et l'exactitude, la précision de la plupart des minuteries est pire que sa précision). L'utilisation d'une machine virtuelle peut aggraver aussi.

Mise à jour: Typo

Il est pas qu'il est en cours d'exécution en arrière. Il serait préférable de dire qu'il ne signale pas l'heure exacte. En effet, les ordinateurs, sans l'aide d'un sous-système de synchronisation dédié, sont tout simplement pas en mesure de déclarer le temps de façon très précise à des intervalles de milliseconde simples.

La précision varie avec le matériel, le système d'exploitation et même l'alimentation. Voici un article pour commencer . Un peu vieux mais communique l'idée bien.

Le temps ne doit pas fonctionner en arrière sur le matériel réel; sur une machine virtuelle votre kilométrage peut varier.

Dans tous les cas, votre demande ne devrait probablement pas supposer que le temps ne fonctionne pas en arrière par une très petite quantité (pensez, peut-être 1 seconde).

Oui, clock_gettime est bonne, mais même que peut courir en arrière dans le cas de matériel défectueux (ou une machine virtuelle, comme dans votre exemple).

Je l'ai vu un temps de bug matériel de faire courir en arrière (bien que très rarement), il était une cause de certains problèmes très particuliers.

En particulier, tout ce qui consiste à comparer les horodatages de fichiers va mal tourner quand le temps passe en arrière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top