为什么运行程序的性能会随着时间的推移而变得更好?

ser*_*gej 12 c++ x86-64 c++11

请考虑以下代码:

#include <iostream>
#include <chrono>

using Time = std::chrono::high_resolution_clock;
using us = std::chrono::microseconds;

int main()
{
    volatile int i, k;
    const int n = 1000000;

    for(k = 0; k < 200; ++k) {
            auto begin = Time::now();
            for (i = 0; i < n; ++i);  // <--
            auto end = Time::now();
            auto dur = std::chrono::duration_cast<us>(end - begin).count();
            std::cout << dur << std::endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我反复测量内部for循环的执行时间.结果如下图所示(y:持续时间,x:重复):

在此输入图像描述

是什么导致循环执行时间减少?

环境:linux(内核4.2)@ Intel i7-2600,编译使用:g++ -std=c++11 main.cpp -O0 -o main

编辑1

问题不在于编译器优化或性能基准.问题是,为什么性能会随着时间的推移而变得更好.我试图了解运行时发生的事情.

编辑2

正如Vaughn Cato所提出的,我已将CPU频率扩展策略更改为" 性能 ".现在我得到以下结果:

在此输入图像描述

这证实了Vaughn Cato的猜想.抱歉这个愚蠢的问题.

Vau*_*ato 16

您可能看到的是CPU频率缩放(限制).当CPU没有被大量使用时,CPU进入低频状态以节省功率.

在运行程序之前,CPU时钟速度可能相当低,因为没有大的负载.运行程序时,忙循环会增加负载,CPU时钟速度会上升,直到达到最大时钟速度,从而减少时间.

如果您连续多次运行程序,您可能会在第一次运行后看到时间保持在较低值.