请考虑以下代码:
#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时钟速度会上升,直到达到最大时钟速度,从而减少时间.
如果您连续多次运行程序,您可能会在第一次运行后看到时间保持在较低值.