gpt4 book ai didi

c++ - Google Benchmark Iteration 是什么意思?

转载 作者:行者123 更新时间:2023-11-28 04:07:20 24 4
gpt4 key购买 nike

我正在使用 Google Benchmark 来测量某些代码的执行时间。例如,我写了下面的代码来衡量它的执行时间性能。

#include <benchmark/benchmark.h>

// Alternatively, can add libraries using linker options.
#ifdef _WIN32
#pragma comment ( lib, "Shlwapi.lib" )
#ifdef _DEBUG
#pragma comment ( lib, "benchmarkd.lib" )
#else
#pragma comment ( lib, "benchmark.lib" )
#endif
#endif

static void BenchmarkTestOne(benchmark::State& state) {
int Sum = 0;
while (state.KeepRunning())
{
for (size_t i = 0; i < 100000; i++)
{
Sum += i;
}
}
}

static void BenchmarkTestTwo(benchmark::State& state) {
int Sum = 0;
while (state.KeepRunning())
{
for (size_t i = 0; i < 10000000; i++)
{
Sum += i;
}
}
}

// Register the function as a benchmark
BENCHMARK(BenchmarkTestOne);
BENCHMARK(BenchmarkTestTwo);


// Run the benchmark
BENCHMARK_MAIN();

当上面的代码运行时,它显示了以下结果:

Benchmark                 Time             CPU   Iterations
-----------------------------------------------------------
BenchmarkTestOne 271667 ns 272770 ns 2635
BenchmarkTestTwo 27130981 ns 27644231 ns 26

但是我一直想不通这里Iterations是什么意思?还有为什么时间和 CPU 彼此不同?

最佳答案

Google Benchmark 会尝试在相似的时间和/或足够长的时间内对每个候选人进行基准测试,以获得稳定的结果。

基准计算它实际进行了多少次迭代,以及确切的时间。慢得多的每次迭代基准测试将执行更少的迭代。

打印输出是(计算的)每次迭代时间和基准函数的(计数)迭代。

它实际上可能是对 state.KeepRunning() 的调用计数,但我不知道详细程度。


仅供引用,您的基准测试循环不会返回任何结果或在循环后将其存储到 volatile,因此编译器可以轻松优化循环。另请注意,带符号的溢出在 C 中是 UB,您的 int 肯定会溢出。

(或者 clang 仍然可以根据高斯的 n * (n+1)/2 将这些求和循环优化为封闭形式的公式,但避免溢出。)

禁用优化的基准测试是无用的;不要这样做。

关于c++ - Google Benchmark Iteration 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58493236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com