2012-03-15 3 views
6

私は奇妙な何かに気づいた: 私は和のcoutingと行のコメントを解除することを決定したときに、このコードcoutsコンパイラは、std :: chrono :: system_clock :: now()の呼び出しでコードを並べ替えることができますか? 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"; 


} 

を取ったが、合理的な数字を印刷します。

これは私が最適化を取得する行動は、私が

F(COUT「ノーマル」を取得無効に彼らと一緒に、有効であるが)ので、この標準準拠の動作がある471ミリ秒

を取りましたか? 重要:デッドコードが最適化されているわけではなく、コンソールから実行しているときの遅延がわかり、タスクマネージャでCPUスパイクが見えます。

答えて

9

私の推測では、このデッドコードの最適化であるということである - そして、あなたの負荷のスパイクはが離れて最適化されていないれるベクトルを初期化する作業に起因することが、あなたの未使用sum変数の計算はです。

しかし、私は合計のcoutingで行のコメントを外すことにした場合、それは妥当な数を出力します。

これは私の理論に沿っています。はい、計算の結果を使用することを余儀なくされると、計算自体は最適化できません。

これ以上確認したい場合は、プログラムが準備完了となったときに言うようにして、returnキーを押すと、CPUスパイクが明らかに "なくなった"のを待つことができます。何が起こっているのかについてもっと自信を持ってください。

+0

あなたは正しいですが、今は混乱しています。なぜなら、それは初期化をやっているのですか?私はそれがrand()に副作用がないことを証明できないと思います... – NoSenseEtAl

+0

ouch ... ofcそれはrandが副作用を持っていないことを証明できません - ランドは純粋な関数ではありません...それは状態を持っています。 :)でも、rand()を置き換えても、私はまだ初期化を妨げません。 – NoSenseEtAl

+0

@NoSenseEtAl:初期化は 'push_back'を使って動作します...だから、コンパイラが' v 'は後でそれを破棄する方法でしか使われないので、' push_back() 'に他の副作用がないと仮定するのは満足できません。私は確かに言いたい。 –

関連する問題