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 彼此不同?
Google Benchmark 试图在相似的时间内对每个候选者进行基准测试,和/或足够长的时间以获得稳定的结果。
该基准测试计算了它实际执行的迭代次数以及确切的时间。慢得多的每次迭代基准将执行更少的迭代。
打印输出是(计算的)每次迭代时间和(计算的)基准函数的迭代次数。
它实际上可能是对 的调用计数state.KeepRunning()
,但我不知道详细程度。
仅供参考,您的基准测试循环不会返回任何结果或将其存储到volatile
循环后,因此编译器可以轻松优化循环。另请注意,有符号溢出在 C 中是 UB,并且您int
肯定会溢出。
(或者 clang 仍然可以将这些求和循环优化为基于高斯的封闭形式公式n * (n+1) / 2
,但避免溢出。)
禁用优化的基准测试是没有用的;不要这样做。
归档时间: |
|
查看次数: |
9105 次 |
最近记录: |