До сих пор я использовал традиционный способ сравнения параллельных методов, который заключается в измерении истекшей продолжительности для ряда прогонов:
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);
}
, который казался все в порядке и до тех пор, пока я не натолкнулся на этот вопрос: цикл в C ++ 0x .
Что меня удивляет, так это то, что компилятору разрешено выполнять вывод ДО цикла ... и мне вдруг стало интересно:
Что мешает компилятору выполнить time_t end = time(0);
перед циклом?
потому что, если бы это произошло, это как-то испортило бы мой маленький тестовый код.
И пока мы находимся на этом, если когда-либо может измениться порядок в этой ситуации:
Как можно предотвратить это?
Я не мог думать о соответствующих тегах, кроме тегов C ++, если кто-то думает, что я пропустил один, не стесняйтесь добавлять его