使用<ctime>和指令重新排序进行基准测试

Mat*_* M. 6 c++ c++11

到目前为止,我一直在使用传统的方法来对并发方法进行基准测试,即测量多次运行的持续时间:

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++之外我无法想到相关标签,如果有人认为我错过了它,请随意添加它

jpa*_*cek 6

这是一个棘手的问题.

什么阻止编译器执行time_t end = time(0); 在循环之前?

一般来说,没有; 事实上,即使在C++ 03中.由于as-if规则,编译器可以发出任何具有相同可观察行为的代码.这意味着,如果省略f()不改变任何指定的输入/输出或挥发性访问,它可能根本不运行f().

让我觉得不寻常的是允许编译器在循环之前执行输出

这不是真的 - 空循环的问题是C++ 0x不仅仅将非终结视为可观察行为.并不是它可以重新排序空循环和输出"Hello",而是编译器可以完全忽略空循环.