谷歌基准迭代的意义是什么?

3 c++ windows benchmarking google-benchmark

我正在使用 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();
Run Code Online (Sandbox Code Playgroud)

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

Benchmark                 Time             CPU   Iterations
-----------------------------------------------------------
BenchmarkTestOne     271667 ns       272770 ns         2635
BenchmarkTestTwo   27130981 ns     27644231 ns           26
Run Code Online (Sandbox Code Playgroud)

但我不明白这里的迭代是什么意思?还有为什么 Time 和 CPU 彼此不同?

Pet*_*des 6

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

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

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

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


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

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

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