到目前为止,我一直在使用传统的方法来对并发方法进行基准测试,即测量多次运行的持续时间:
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);
}
Run Code Online (Sandbox Code Playgroud)
在我遇到这个问题之前看起来一切都很好和花花公子:优化掉"while(1);" 在C++ 0x中循环.
让我感到不同寻常的是,允许编译器在循环之前执行输出......我突然想知道:
什么阻止编译器
time_t end = time(0);在循环之前执行?
因为如果它这样做,那将以某种方式拧紧我的小基准代码.
虽然我们在这里,但如果在这种情况下可能发生重新排序:
怎么能阻止它呢?
除了C++之外我无法想到相关标签,如果有人认为我错过了它,请随意添加它
这是一个棘手的问题.
什么阻止编译器执行time_t end = time(0); 在循环之前?
一般来说,没有; 事实上,即使在C++ 03中.由于as-if规则,编译器可以发出任何具有相同可观察行为的代码.这意味着,如果省略f()不改变任何指定的输入/输出或挥发性访问,它可能根本不运行f().
让我觉得不寻常的是允许编译器在循环之前执行输出
这不是真的 - 空循环的问题是C++ 0x不仅仅将非终结视为可观察行为.并不是它可以重新排序空循环和输出"Hello",而是编译器可以完全忽略空循环.