6

在玩 VS11 beta 时,我注意到一些奇怪的东西:这段代码

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


}

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

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

f() 耗时 471 毫秒

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

4

1 回答 1

10

我的猜测是,这死代码优化 - 你的负载峰值是由于初始化向量的工作没有被优化掉,但是你未使用的sum变量的计算.

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

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

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

于 2012-03-15T00:12:17.613 回答