Google Benchmark 是 C++ 最常用可靠的微基准测试框架,专为精确测量小段代码执行时间设计,自动处理预热、采样、统计与输出;安装推荐 vcpkg 或源码编译,编写需用 benchmark::State& 参数并循环调用 KeepRunning()。

Google Benchmark 是 C++ 里最常用、最可靠的微基准(microbenchmark)测试框架,专为精确测量小段代码的执行时间而设计。它自动处理预热、多次采样、统计分析和结果输出,比手写 std::chrono 循环靠谱得多。
一、安装与基础编译
推荐用 CMake + vcpkg 或直接源码编译:
- vcpkg 安装(推荐新手):
vcpkg install benchmark,然后在 CMakeLists.txt 中find_package(benchmark CONFIG REQUIRED) - 手动编译:从 GitHub 仓库 克隆,运行
cmake -G "Ninja" && ninja && ninja install - 确保链接
benchmark和pthread(Linux/macOS 必须)
二、写一个最简 benchmark
每个测试函数必须接受一个 benchmark::State& 参数,并在循环中调用 state.KeepRunning():
#include#include static void BM_VectorPushBack(benchmark::State& state) { for (auto _ : state) { std::vector v; for (int i = 0; i < state.range(0); ++i) { v.push_back(i); } } } BENCHMARK(BM_VectorPushBack)->Range(1<<10, 1<<16); // 测试 1K ~ 64K 元素 BENCHMARK_MAIN(); // 自动生成 main()
关键点:
立即学习“C++免费学习笔记(深入)”;
-
for (auto _ : state)是框架控制循环的核心语法,每次迭代对应一次 benchmark 运行 -
state.range(0)读取命令行传入的参数(如--benchmark_range=1024) -
BENCHMARK_MAIN()自动提供带参数解析的 main 函数,无需自己写
三、常用技巧与避坑指南
真实场景中容易忽略细节,导致结果失真:
- 避免编译器优化掉被测代码:用
benchmark::DoNotOptimize(x)或benchmark::ClobberMemory() - 需要初始化开销不计入耗时?用
state.PauseTiming()/state.ResumeTiming() - 想对比不同实现?用
BENCHMARK_REGISTER_F+ fixture 类,共享 setup/teardown 逻辑 - 输出 JSON 或 CSV 报告?加参数:
--benchmark_format=json --benchmark_out=result.json
四、运行与解读结果
编译后直接运行可执行文件,例如:
./benchmarks --benchmark_filter=Vector --benchmark_repetitions=3
典型输出含:
- real_time:实际挂钟时间(含系统调度等),通常关注这个
- cpu_time:进程占用 CPU 时间,适合排除 I/O 干扰
-
bytes_per_second / items_per_second:对吞吐类 benchmark 很有用(需调用
state.SetBytesProcessed()) - 每项重复多次后的均值、标准差,帮你判断稳定性
基本上就这些。不复杂但容易忽略 timing 控制和防优化,跑准了才能真的比出快慢。











