为什么每次执行此程序时CPU时间都不同?

Mar*_*dik -1 c++ performance clock

我很难理解处理器的时间.该计划的结果:

#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";
}
Run Code Online (Sandbox Code Playgroud)

似乎在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时间应该是:

  1. 总是一样
  2. 略高于执行的指令数量

我的实验也没有显示,因为我的程序至少需要执行3 * size * size指令.你能解释一下我做错了什么吗?

Jam*_*nze 7

首先,您从维基百科中引用的陈述是完全错误的.20年前可能是真的(但并非总是如此),但今天却完全错误.有很多事情会影响你的时间:

  • 第一种:如果您在Windows上运行,clock则会损坏,并且完全不可靠.它返回经过时间的差异,而不是CPU时间.经过的时间取决于处理器可能正在做的各种其他事情.

  • 除此之外:缓存未命中等因素会对时间产生非常重大的影响.并且特定数据是否在缓存中可能取决于您的程序在上次访问和此访问之间是否被中断.

通常,任何低于10%的内容都可能很容易归因于缓存问题.我在Windows下看到了10倍的差异,具体取决于是否有运行.