プロセッサー時間を理解するのに苦労しています。このプログラムの結果:
#include <iostream>
#include <chrono>
// the function f() does some time-consuming work
void f()
{
volatile long double d;
int size = 10000;
for(int n=0; n<size; ++n)
for(int m=0; m<size; ++m)
d = n*m;
}
int main()
{
std::clock_t start = std::clock();
f();
std::clock_t end = std::clock();
std::cout << "CPU time used: "
<< (end - start)
<< "\n";
}
210 000、220 000、230 000 の間でランダムに変動しているようです。なぜこれらの離散値なのか、最初は驚きました。次に、おおよそのプロセッサ時間std::clock()
のみを返すことがわかりました。おそらく、によって返される値は10,000 の倍数に丸められます。これは、CPU 時間の最大差が 20,000 である理由も説明します (10,000 == への最初の呼び出しによる丸め誤差と 2 番目の呼び出しによる 10,000)。std::clock()
std::clock()
int size = 40000;
しかし、 の本体でに変更するとf()
、丸めでは説明できない 3 400 000 から 3 500 000 の範囲の変動が得られます。
ウィキペディアでクロックレートについて読んだことから:
CPU は、各命令を実行するために一定数のクロック ティック (またはクロック サイクル) を必要とします。クロックが速いほど、CPU が 1 秒間に実行できる命令が多くなります。
つまり、プログラムが決定論的である場合 (私の場合はそうであることを願っています)、終了に必要な CPU 時間は次のようになります。
- いつも同じ
- 実行された命令の数よりもわずかに多い
私のプログラムは少なくとも3 * size * size
命令を実行する必要があるため、私の実験ではどちらも示されません。私が間違っていることを説明していただけますか?