我们可以使用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
做什么?它将迭代次数重置为最大值
很明显,你只应该调用begin
和end
一次。第三个循环的不同之处在于每次迭代调用一次std::end(state)
,这显然将迭代计数重置回最大值。
我不知道为什么这个图书馆是这样设计的。