3

私は Timer クラスをプログラムしようとしていました (boost にクラスがあることに気づいていませんでした)。

#include <ctime>
#include <iostream>

int main()
{
 for(int i = 0; i < 50; ++i)
 {
  std::cout << std::clock() << " ";
 }
 return 0;
}

プログラムを実行すると、一連の 0 が返されます。ブースト スレッド スリープ関数を使用してタイミングを少し広げたときにも同様の経験があります (ただし、数秒後には 0 から 10,000 にジャンプし、10,000 を出力し続けます)。

Gentoo Linux を実行しています。これはプラットフォームのことですか?C++のこと?どうしたの?

編集:奇妙なことに、10000 へのジャンプは、ミリではなく秒数の後に発生します。一度に 1 秒ずつスレッドをスリープさせていたとき、10000 に到達するのに 5 ~ 6 秒かかりました。ただし、正しく理解していれば。スレッドがスリープに費やす時間は、clock() カウントに影響しませんか? (どちらが理にかなっていますか? スリープしているのに、なぜクロックサイクルを実行するのでしょうか?)

4

4 に答える 4

7

clock()戻り値はマイクロ秒単位で指定されます。しかし、実装が使用する低レベルのシステム コールの一般的な粒度は、clock()はるかに低くなります。したがって、あなたのシステムでは粒度は 10ms のようです。また、 はリアルタイムを測定しないことに注意してください。これは、プログラムが使用する CPU 時間を測定clock()ます。したがって、プログラムが CPU を制御している間は時間が流れ、プログラムが一時停止中 (スリープ中など) になると時間はフリーズします。

于 2010-08-30T02:11:06.460 に答える
0

std::clockの解像度は指定されていません。ほとんどの場合、解像度は約10ms. したがって、ジャンプ。

于 2010-08-30T02:11:30.310 に答える
0

次のことを試してください。

#include <ctime>
#include <iostream>

int main()
{
   for(int i = 0; i < 50; ++i)
   {
      for (int j = 0; j < 500; ++j )
      {
         std::cout << j << " ";
      }
      std::cout << std::endl;
      std::cout << std::clock() << std::endl;
   }
   std::cout << std::endl;
   0 を返します。
}     

私のシステムでは、ある時点で 10000 にジャンプするまで、clock() の戻り値が 0 のままであることがわかります。最後まで 10000 のままです。内側のループで std::cout を削除すると、clock() の戻り値は最後まで 0 のままです。clock() は 10000 単位で値を返すようです。

内部ループを変更して j の平方根を計算し、sqrt() の戻り値を出力すると、clock() の戻り値は 50000 まで上がりますが、それでも 10000 ずつ増加します。

于 2010-08-30T03:07:55.803 に答える
0

私の 64 ビット オペレーティング システムでは、CLOCKS_PER_SEC 速度は 1000 で、クロックの値はミリ秒単位です。完璧なタイミングは、以下のコードから抽出されます。

int main(){

clock_t a,b;
int c,d,e,f;
c=clock();
scanf("%d",&e);
d=clock();
f=(d-c)/CLOCKS_PER_SECOND;
printf("timing is %d seconds",f);/*for 64 bit operating system         
CLOCKS_PER_SECOND is 1000*/




}
于 2015-01-24T21:25:10.673 に答える