2

プログラムで発生するいくつかのイベント間の時間間隔(1秒の1/10)を計算したいと思います。したがって、私はclockこれらのニーズに次のような関数を使用します。

    clock_t begin;
    clock_t now;
    clock_t diff;

    begin = clock();

    while ( 1 )
    {
        now = clock();
        diff = now - begin;
        cout << diff / CLOCKS_PER_SEC << "\n";
        //usleep ( 1000000 );
    };

0プログラムが1秒間、次に11秒間、次に1秒間印刷されることを期待してい2ます。など...実際には、約8秒間印刷0され、次に約8秒間印刷1されます。

ちなみに、usleepプログラムを順番に追加すると、1秒間に1回しか印刷されないので0、ずっと長くしか印刷されません...

助けてくれてありがとう!

4

5 に答える 5

2

このclock()関数は、プログラムに請求されたCPU時間を返します。通話中にブロックされた場合usleep()、時間は請求されないため、時間が増加しないように見える理由が非常に明確になります。1秒の充電に8秒かかるように見える理由については、システム内で他のことが起こっており、消費したいCPU時間を消費していますが、プロセッサを共有する必要があります。clock()リアルタイムの経過を測定するために使用することはできません。

于 2012-08-18T18:05:14.557 に答える
1

古いプリントがバッファリングされているので、あなたのプリントは非常に魅力的だと思います。バッファが大きくなり、コンソールへの出力がタイトなループに追いつかなくなります。スリープを追加することで、バッファがフラッシュして追いつくまでの時間を確保できます。つまり、プログラムの開始から8秒であっても、8秒前の印刷物です。

実際のタイムスタンプをprintステートメントに入れることをお勧めします。タイムスタンプが実際の時刻から大幅に遅れているかどうかを確認します。

于 2012-08-18T18:03:35.110 に答える
1

Boostを使用できる場合は、BoostTimersライブラリを確認してください。

于 2012-08-18T19:39:51.817 に答える
0

関数について読んでくださいtime()

于 2012-08-18T19:15:15.833 に答える
0

たぶん、それを2倍に型キャストする必要があります。

cout << (double)(diff / CLOCKS_PER_SEC) << "\n";

整数は四捨五入され、あなたの場合はおそらく0になります。

于 2012-08-18T18:01:15.173 に答える