23

これは、時間が実際に 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.
4

5 に答える 5

30

gettimeofday()単調であるとは限りません。clock_gettime(CLOCK_MONOTONIC)その保証が必要な場合に使用します。

于 2011-01-26T03:20:49.417 に答える
17

VirtualBox Bug Tracker に未解決の問題があります。gettimeofday()を使用して時間の経過を測定してはならない理由を説明しているブログ投稿にリンクしています。

時間を正しく測定する最も移植性の高い方法は、clock_gettime(CLOCK_MONOTONIC, ...) のようです。

于 2011-01-26T03:25:27.250 に答える
10

ほとんどのマシンのマシン タイマーの精度は約 15 usec です (ネイティブ コードに対しても)。時間が「逆行」するのは奇妙ですが、とにかくそのレベル (1 usec) に頼ることはできません。(注意: 精度と精度には違いがあります。ほとんどのタイマーの精度は精度よりも悪いです)。仮想マシンを使用すると、これも悪化する可能性があります。

更新: タイプミス

于 2011-01-26T03:17:18.967 に答える
5

逆走しているわけではありません。正確な時刻を報告していないと言ったほうがよいでしょう。これは、専用のタイミング サブシステムの助けがなければ、コンピューターは 1 ミリ秒間隔で非常に正確に時間を報告できないためです。

精度は、ハードウェア、OS、さらには電源によって異なります。これは初心者向けの記事です。少し古いですが、アイデアをうまく​​伝えています。

于 2011-01-26T03:16:37.817 に答える
1

実際のハードウェアでは時間が逆戻りしてはなりません。VM では、走行距離が異なる場合があります。

いずれにせよ、あなたのアプリケーションはおそらく、時間が非常にわずか (1 秒程度) も逆行しないと想定すべきではありません。

はい。_

ハードウェアのバグによって時間が逆行するのを見たことがあります (非常にまれではありますが)。

特に、ファイルのタイムスタンプの比較に関係するものはすべて、時間が遡るとうまくいきません。

于 2011-01-26T11:34:10.203 に答える