NoS*_*tAl 6 optimization visual-studio c++11 c++-chrono
在玩VS11测试版的时候,我注意到了一些奇怪的东西:这个代码couts
f耗时0毫秒
int main()
{
std::vector<int> v;
size_t length =64*1024*1024;
for (int i = 0; i < length; i++)
{
v.push_back(rand());
}
uint64_t sum=0;
auto t1 = std::chrono::system_clock::now();
for (size_t i=0;i<v.size();++i)
sum+=v[i];
//std::cout << sum << std::endl;
auto t2 = std::chrono::system_clock::now();
std::cout << "f() took "
<< std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
<< " milliseconds\n";
}
Run Code Online (Sandbox Code Playgroud)
但是,当我决定取消注释总和时,它打印出一个合理的数字.
这是我启用优化后的行为,禁用它们我得到"正常"cout
f()花了471毫秒
这个符合标准的行为是什么?重要提示:不是死代码被优化掉了,我可以看到从控制台运行时的滞后,我可以看到任务管理器中的CPU峰值.
Jon*_*eet 10
我的猜测是这是死代码优化 - 并且你的负载峰值是由于初始化向量的工作没有被优化掉,但你未使用的sum变量的计算是.
但是,当我决定取消注释总和时,它打印出一个合理的数字.
这与我的理论一致,是的 - 当你被迫使用计算结果时,计算本身无法被优化掉.
如果你想进一步确认,让你的程序在准备就绪时说出来并暂停按下返回 - 这样你就可以等到任何CPU峰值在你按回车之前明显"消失",这会让你更有信心关于是什么导致它.
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |