我們可以使用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 進行陳述句時,它會在沒有完成的情況下運行。
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 就是用這種風格實作的。他們如何表現不同?
uj5u.com熱心網友回復:
/函式記錄有警告begin:說“不應直接呼叫這些函式”end
不應直接呼叫這些函式。
要求:基準測驗尚未開始運行。begin 和 end 之前都沒有被呼叫過。
end來電StartKeepRunning
有什么作用StartKeepRunning?它將迭代次數重置為最大值
begin很明顯,您只應該呼叫end一次。第三個回圈的不同之處在于std::end(state)每次迭代呼叫一次,這顯然會將迭代計數重置為最大值。
我不知道為什么圖書館是這樣設計的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481521.html
