基准测试中不同"for"的不同行为



我们可以使用google benchmark或https://www.quick-bench.com/编写一个简单的基准测试,

static void range_based_for(benchmark::State &state) {
for (auto _ : state) {
std::to_string(__LINE__);
}
}
BENCHMARK(range_based_for);

也可以重写为std::for_each,

static void std_for_each(benchmark::State &state) {
std::for_each (std::begin(state), std::end(state), [] (auto _) {
std::to_string(__LINE__);
});
}
BENCHMARK(std_for_each);

一切顺利。然而,当我们使用old school for语句时,它运行时没有结束。

static void old_school_for(benchmark::State &state) {
for (auto iter = std::begin(state); iter != std::end(state); ++iter) {
std::to_string(__LINE__);
};
}
BENCHMARK(old_school_for);

实际上,std::for_each就是用这种风格实现的。他们怎么能表现得不同呢?

begin/end函数的文档中有一个警告:'这些函数不应该被直接调用';

这些函数不应该直接调用。

REQUIRES:基准测试还没有开始运行。begin和end之前都没有调用。

end呼叫StartKeepRunning

StartKeepRunning做什么?它将迭代次数重置为最大值

很明显,你只应该调用beginend一次。第三个循环的不同之处在于每次迭代调用一次std::end(state),这显然将迭代计数重置回最大值。

我不知道为什么这个图书馆是这样设计的。

最新更新