私は奇妙な何かに気づいた: 私は和の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スパイクが見えます。
あなたは正しいですが、今は混乱しています。なぜなら、それは初期化をやっているのですか?私はそれがrand()に副作用がないことを証明できないと思います... – NoSenseEtAl
ouch ... ofcそれはrandが副作用を持っていないことを証明できません - ランドは純粋な関数ではありません...それは状態を持っています。 :)でも、rand()を置き換えても、私はまだ初期化を妨げません。 – NoSenseEtAl
@NoSenseEtAl:初期化は 'push_back'を使って動作します...だから、コンパイラが' v 'は後でそれを破棄する方法でしか使われないので、' push_back() 'に他の副作用がないと仮定するのは満足できません。私は確かに言いたい。 –