Вопрос

Вот небольшой тест, который я написал, чтобы проверить, что время действительно работает только в 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;
}

Тест не удается с результатом.

 tv1: 1296011067 632550
 tv2: 1296011067 632549

ммм ....

Почему это происходит?

Вот моя установка:

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.
Это было полезно?

Решение

Есть Открыть проблему в The VirtualBox Tracker. Анкет Они ссылаются на сообщение в блоге, в котором говорится, почему Вы не должны использовать getTimeOfday () Чтобы измерить время от времени:

Наиболее портативным способом правильного измерения времени кажется clock_gettime (clock_monotonic, ...)

Другие советы

gettimeofday() не гарантированно будет монотонным. Использовать clock_gettime(CLOCK_MONOTONIC) Если вам нужна эта гарантия.

Таймеры машин на большинстве машин имеют только около 15 точности использования (даже для собственного кода). Время идти «назад» странно, но вы действительно не можете полагаться на этот уровень (1 usec) в любом случае. (Также примечание: существует разница между точностью и точностью; точность большинства таймеров хуже, чем ее точность). Использование виртуальной машины также может усугубить это.

Обновление: опечатка

Дело не в том, что он бежит назад. Было бы лучше сказать, что это не сообщает о правильном времени. Это связано с тем, что компьютеры без помощи выделенной подсистемы времени просто не способны очень точно сообщать о времени в одном миллисекундном интервале.

Точность будет варьироваться в зависимости от оборудования, ОС и даже источника питания. Вот Статья для начала. Анкет Немного старый, но хорошо передает эту идею.

Время не должно бежать назад на реальном оборудовании; На виртуальной машине ваш пробег может варьироваться.

В любом случае, ваше приложение, вероятно, не должно предполагать, что время не работает назад на очень маленькую сумму (подумайте, может быть, 1 секунда).

Да, clock_gettime хорош, но даже это мог Бегите назад в случае неисправного оборудования (или виртуальной машины, как в вашем примере).

Я видел аппаратную ошибку, заставляя время бежать назад (хотя и очень иногда), это было причиной некоторых очень особых проблем.

В частности, все, что включает в себя сравнение временных метров файла, пойдет не так, когда время уйдет назад.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top