33

1 秒あたりのクロック ティックの実際の数を概算するために、この短い C++ プログラムを作成しました。

#include <iostream>
#include <time.h>

using namespace std;

int main () {

    for(int i = 0; i < 10 ; i++) {

        int first_clock = clock();
        int first_time = time(NULL);

        while(time(NULL) <= first_time) {}

        int second_time = time(NULL);
        int second_clock = clock();

        cout << "Actual clocks per second = " << (second_clock - first_clock)/(second_time - first_time) << "\n";

        cout << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << "\n";

    }

    return 0;

}

プログラムを実行すると、次のような出力が得られます。

Actual clocks per second = 199139
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 638164
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 610735
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 614835
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 642327
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 562068
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 605767
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 619543
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 650243
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 639128
CLOCKS_PER_SEC = 1000000

1 秒あたりの実際のクロック ティック数が CLOCKS_PER_SEC と一致しないのはなぜですか? それらはほぼ等しくさえありません。何が起きてる?

4

6 に答える 6

36

clockプログラムで費やされた時間を返します合計 1 秒あたり 1,000,000 クロック ティックがあります*。あなたのプログラムはそれらの 60% を消費したようです。

他の何かが残りの 40% を使用しました。

*さて、事実上1 秒あたり 1,000,000 のクロック ティックがあります。実際の数は正規化されているため、プログラムは 1,000,000 ティックを認識します。

于 2012-05-04T20:54:36.897 に答える
21

のマニュアルページからclock(3)

POSIXでは、実際の解像度に関係なく、CLOCKS_PER_SECが1000000に等しい必要があります。

あなたの実装は、少なくともその点ではPOSIXに従っているようです。

ここであなたのプログラムを実行すると、

Actual clocks per second = 980000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 990000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000

またはアイドル状態のマシンでの同様の出力、および次のような出力

Actual clocks per second = 50000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 600000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 530000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 580000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 730000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 730000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 600000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 560000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 600000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 620000
CLOCKS_PER_SEC = 1000000

忙しいマシンで。プログラムで費やされた(おおよその)時間を測定するのでclock()、ビジー状態のマシンでテストしたようで、プログラムはCPU時間の約60%しか取得していません。

于 2012-05-04T20:47:13.120 に答える
6
  1. POSIX の CLOCKS_PER_SECOND は、1000000 に等しい定数です。
  2. CLOCKS_PER_SECOND は、プロセスのクロック数を表示することは想定されていません。これは、クロック数を時間量に変換するために使用できる解像度の数値です (clock() 関数のマニュアル ページを参照してください)。

たとえば、次のように計算するとします。

(second_clock-first_clock)/CLOCKS_PER_SEC

"clock()" 関数への最初の呼び出しと 2 番目の呼び出しの間の合計時間を取得します。

于 2015-12-09T22:31:58.893 に答える
1

C99規格

C99 N1256 標準ドラフトが述べている唯一のことは、次のCLOCKS_PER_SECことです。

CLOCKS_PER_SEC は、クロック関数によって返される値の 1 秒あたりの数である clock_t (後述) 型の式に展開されます。

他の人が言及しているように、POSIX はこれを 100 万に設定しているため、この精度は 1 マイクロ秒に制限されています。これは、CPU の最大周波数がメガヘルツで測定されていた時代の単なる歴史的な値だと思います。

于 2016-04-16T13:10:46.247 に答える
0

int first_time = time(NULL);を設定した場合 、time(NULL) は、+1 回転から「1 ナノ秒離れている」可能性があります (切り捨てられているため)。したがって、 while(time(NULL) <= first_time) {} は、予想よりも 1 秒以上速くジャンプできます。

そのため、あなたの「1 秒」に含まれる時計の数が少なくなります。

于 2020-09-18T00:31:44.510 に答える
-2

まあまあ。タイミングを開始するのは、現在の秒のどこまでかわかりませんね。したがって、1からCLOCKS_PER_SECまでの任意の結果を取得できます。あなたの内側のループでこれを試してください:

int first_time = time(NULL);
// Wait for timer to roll over before starting clock!
while(time(NULL) <= first_time) {}

int first_clock = clock();
first_time = time(NULL);
while(time(NULL) <= first_time) {}

int second_time = time(NULL);
int second_clock = clock();

cout << "Actual clocks per second = " << (second_clock - first_clock)/(second_time - first_time) << "\n";

cout << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << "\n";

完全なソースコードについては、 ideoneを参照してください。ご想像のとおり、1秒あたりの実際のクロックは1000000として報告されます。(ideoneがタイムアウトしないように、反復回数を2回に減らす必要がありました。)

于 2012-05-04T21:04:33.383 に答える