到目前为止,我一直在使用传统方法来对并发方法进行基准测试,即测量多次运行的持续时间:
template <typename Functor>
double benchmark(Functor const& f, size_t nbRuns)
{
if (nbRuns == 0) { return 0.0; }
f(); // Initialize before measuring, I am not interesting in setup cost
time_t begin = time(0);
for (size_t i = 0; i != nbRuns; ++i) { f(); }
time_t end = time(0);
return difftime(end, begin);
}
这看起来一切都很好,直到我遇到这个问题:优化掉“while(1);” C++0x 中的循环 https://stackoverflow.com/questions/3592557/optimizing-away-a-while1-in-c0x.
让我觉得不寻常的是,编译器被允许在循环之前执行输出......我突然想知道:
是什么阻止编译器执行time_t end = time(0);
在循环之前?
因为如果确实如此,那会以某种方式搞砸我的小基准代码。
当我们这样做时,如果在这种情况下可能发生重新排序:
如何预防呢?
除了 C++ 标签之外,我想不出相关标签,如果有人认为我错过了一个,请随时添加
这是一个棘手的问题。
是什么阻止了编译器
执行 time_t end = time(0);前
这里的循环?
一般来说,什么都没有;事实上,即使在 C++03 中也是如此。由于 as-if 规则,编译器可能会发出具有相同可观察行为的任何代码。这意味着,如果省略f()
不更改任何指定的输入/输出或易失性访问,它可能无法运行f()
at all.
让我觉得不寻常的是
编译器被允许执行
循环之前输出
这并不是真的——空循环的问题是 C++0x 不将单纯的非终止视为可观察的行为。这并不是说它可以对空循环和输出进行重新排序"Hello"
,而是编译器可以完全忽略空循环。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)