我很难理解处理器时间。这个程序的结果:
#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()
只返回近似的处理器时间。所以可能返回的值std::clock()
被四舍五入到 10 000 的倍数。这也可以解释为什么 CPU 时间之间的最大差异是 20 000 (第一次调用时 10 000 == 舍入误差,第二次调用时为std::clock()
10 000)。
但是,如果我更改为int size = 40000;
,f()
我会在 3 400 000 到 3 500 000 的范围内出现波动,这无法用四舍五入来解释。
根据我在维基百科上读到的关于时钟频率的内容:
CPU 需要固定数量的时钟节拍(或时钟周期)来执行每条指令。时钟越快,CPU 每秒可以执行的指令越多。
也就是说,如果程序是确定性的(我希望我的程序是确定性的),那么完成所需的 CPU 时间应该是:
- 总是一样
- 略高于执行的指令数
我的实验都没有显示,因为我的程序至少需要执行3 * size * size
指令。你能解释一下我做错了什么吗?