web-dev-qa-db-ja.com

CLOCKS_PER_SECが実際の1秒あたりのクロック数ではないのはなぜですか?

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と一致しないのはなぜですか?それらはほぼ等しくさえありません。何が起きてる?

24
Kevin H. Lin

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

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

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

32
Robᵩ
  1. POSIXのCLOCKS_PER_SECONDは1000000に等しい定数です。
  2. CLOCKS_PER_SECONDは、プロセスのクロック数を表示することを想定していません。これは、クロックの数を時間に変換するために使用できる解像度の数値です(clock()関数のマニュアルページを参照)

たとえば、計算する場合:

(second_clock-first_clock)/ CLOCKS_PER_SEC

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

4
ImanKh

C99標準

C99 N1256標準ドラフトCLOCKS_PER_SECは:

CLOCKS_PER_SECは、clock関数によって返される値の1秒あたりの数であるタイプclock_t(以下で説明)を持つ式に展開されます

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