gpt4 book ai didi

visual-studio - 编译器可以通过调用 std::chrono::system_clock::now() 重新排序代码吗?

转载 作者:行者123 更新时间:2023-12-03 15:51:10 25 4
gpt4 key购买 nike

在玩 VS11 测试版时,我注意到一些奇怪的事情:
这个代码couts

f took 0 milliseconds


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";


}

但是当我决定用计算总和取消注释该行时,它会打印出一个合理的数字。

这是我在启用优化后得到的行为,禁用优化后我得到“正常”cout

f() took 471 milliseconds



那么这种符合标准的行为吗?
重要提示:并不是死代码被优化掉了,我可以看到从控制台运行时的延迟,我可以看到任务管理器中的 CPU 峰值。

最佳答案

我的猜测是这是死代码优化 - 并且您的负载峰值是由于初始化向量的工作没有被优化,而是您未使用的计算 sum变量是。

But when I decide to uncomment the line with couting of the sum then it prints out a reasonable number.



这符合我的理论,是的 - 当您被迫使用计算结果时,计算本身无法优化。

如果你想进一步确认,让你的程序说它什么时候准备好并暂停让你按回车 - 这将允许你在按回车之前等待任何 CPU 尖峰明显“消失”,这会让你更有信心关于是什么原因造成的。

关于visual-studio - 编译器可以通过调用 std::chrono::system_clock::now() 重新排序代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9712192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com