6

VS11 ベータ版で遊んでいるときに、何かおかしいことに気付きました: このコードは失敗します

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 に答える