Google Benchmark是C++性能测试最主流可靠的选择,能自动处理预热、多次运行、统计误差和消除编译器优化干扰;需用CMake/vcpkg编译链接,以BENCHMARK宏注册函数,用state循环控制计时,配合DoNotOptimize、Pause/ResumeTiming等确保结果真实,并支持JSON输出与多版本对比。

用 C++ 做性能测试,Google Benchmark 是目前最主流、最可靠的选择。它能自动处理预热、多次运行、统计误差、消除编译器优化干扰等问题,比手写 std::chrono 循环测时间更科学、结果更可信。
一、快速上手:编译与链接 Google Benchmark
推荐使用 CMake + vcpkg 或直接源码编译(避免动态链接问题):
- vcpkg 安装(推荐):
vcpkg install benchmark:x64-windows(Windows)或benchmark:x64-linux(Linux) - CMakeLists.txt 中加入:
find_package(benchmark REQUIRED),然后target_link_libraries(your_target PRIVATE benchmark) - 确保关闭
-DNDEBUG外的调试宏(如-DBENCHMARK_ENABLE_GTEST_TESTS=OFF),避免引入 gtest 依赖
二、写一个基础 benchmark 函数
每个测试函数必须以 BENCHMARK() 宏注册,参数是 benchmark::State&,循环由框架控制:
#include#include void BMVectorPushBack(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(128, 16384); // 测试不同数据规模
-
for (auto _ : state)是必需写法——框架会重复执行该循环,并自动管理计时范围 -
state.range(0)读取当前测试规模(支持多档位自动遍历) - 不要在循环内做初始化(如
std::vector v)除非你要测构造开销;否则应提到循环外并用state.PauseTiming()/ResumeTiming()隔离非核心逻辑
三、关键技巧:让结果真实可信
默认行为可能掩盖真实性能,注意以下三点:
立即学习“C++免费学习笔记(深入)”;
-
防止编译器优化掉“无用代码”:对计算结果调用
benchmark::DoNotOptimize(),例如:benchmark::DoNotOptimize(result = compute(x)); -
排除 setup/teardown 开销:用
state.PauseTiming()暂停计时,做完预分配或清理后再ResumeTiming() -
指定迭代次数或时间:用
->Iterations(1000)或->MinTime(0.5)(单位秒)控制采样精度,避免过短导致误差大
四、运行与解读结果
编译后执行可执行文件,支持多种输出格式:
- 默认终端输出:显示每项的平均耗时(ns/op)、标准差、速率(如 items/s)
- 生成 JSON:
--benchmark_format=json --benchmark_out=result.json,方便脚本分析或 CI 存档 - 对比两个版本:
--benchmark_filter=BM_.* --benchmark_repetitions=3可跑多次取中位数,再用--benchmark_compare输出差异百分比
关注 “mean” 和 “stddev”,若 stddev > 5% mean,说明环境干扰大(如 CPU 频率波动、后台进程),建议关掉无关程序、固定 CPU 频率、用 taskset -c 0 绑核重试。











