Pregunta

Aquí hay una pequeña prueba que he escrito para verificar que el tiempo solo se ejecuta en 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;
}

La prueba falla con el resultado.

 tv1: 1296011067 632550
 tv2: 1296011067 632549

Ummm ....

¿Por qué pasó esto?

Aquí está mi configuración:

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.
¿Fue útil?

Solución

Hay un Abra el problema en el rastreador de errores de virtualbox. Se vinculan a una publicación de blog que indica por qué no deberías usar getTimeOfday () Para medir el paso del tiempo:

La forma más portátil de medir el tiempo correctamente parece ser Clock_Gettime (Clock_Monotonic, ...)

Otros consejos

gettimeofday() no se garantiza que sea monotónico. Usar clock_gettime(CLOCK_MONOTONIC) Si necesita esa garantía.

Los temporizadores de la máquina en la mayoría de las máquinas solo tienen aproximadamente 15 precisión de USEC (incluso para el código nativo). El tiempo que va a 'retroceso' es extraño, pero de todos modos no puedes confiar en ese nivel (1 USEC). (Tenga en cuenta: hay una diferencia entre precisión y precisión; la precisión de la mayoría de los temporizadores es peor que su precisión). El uso de una máquina virtual también puede agravar esto.

Actualización: error tipográfico

No es que esté corriendo hacia atrás. Sería mejor decir que no está informando el momento correcto. Esto se debe a que las computadoras, sin la ayuda de un subsistema de tiempo dedicado, simplemente no son capaces de informar el tiempo con mucha precisión en intervalos de un solo milisegundo.

La precisión variará con el hardware, el sistema operativo e incluso la fuente de alimentación. Aquí hay un Artículo para empezar. Un poco viejo pero comunica la idea muy bien.

El tiempo no debe correr hacia atrás en hardware real; En una VM, su kilometraje puede variar.

En cualquier caso, su solicitud probablemente no debería asumir que el tiempo no se agota en una cantidad muy pequeña (piense, tal vez 1 segundo).

Sí, clock_gettime es bueno pero incluso eso pudo Corre hacia atrás en el caso de hardware defectuoso (o una VM, como en su ejemplo).

He visto que un error de hardware hace que el tiempo se agote (aunque muy ocasionalmente), era causa de algunos problemas muy peculiares.

En particular, cualquier cosa que implique comparar marcas de tiempo de archivo saldrá mal cuando el tiempo se retroceda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top