使用 Google Benchmark 进行微基准测试
使用 Google Benchmark 编写可靠的微基准测试,并避免测量误区
使用 Google Benchmark 进行微基准测试 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
为什么使用微基准测试
宏观性能分析可以显示时间花费在哪里。微基准测试则在隔离环境中测量特定代码,对于比较算法或实现很有用。
Google Benchmark 设置
Google 提供的近似仅含头文件的 C++ 基准测试库。通过 vcpkg、Conan 或 apt 安装,并链接 -lbenchmark。
#include <benchmark/benchmark.h>
static void BM_StringCopy(benchmark::State& state) {
std::string s = "Hello, World!";
for (auto _ : state) {
std::string copy(s);
}
}
BENCHMARK(BM_StringCopy);
BENCHMARK_MAIN();编译与运行
使用优化选项进行编译,链接基准测试库,然后运行。
g++ -O2 -DNDEBUG bench.cpp -lbenchmark -lpthread -o bench
./bench解读输出
该库会输出每次迭代的时间、迭代次数和 CPU 时间。将基线结果与修改后的结果进行比较。
避免优化器耍花招
优化器可能删除无用代码。使用 benchmark::DoNotOptimize 强制结果产生可观察的影响。
for (auto _ : state) {
auto result = expensive_function();
benchmark::DoNotOptimize(result);
}防止删除无效存储
benchmark::ClobberMemory 会告诉编译器内存状态已经被观察到,从而防止删除存储操作。
参数化基准测试
在不同输入规模下测试同一个函数。
static void BM_Sort(benchmark::State& state) {
std::vector<int> v(state.range(0));
std::iota(v.rbegin(), v.rend(), 0);
for (auto _ : state) {
auto copy = v;
std::sort(copy.begin(), copy.end());
}
}
BENCHMARK(BM_Sort)->RangeMultiplier(2)->Range(8, 1<<14);多线程基准测试
使用 Threads 修饰符测试可扩展性。
BENCHMARK(BM_ConcurrentMap)->Threads(1)->Threads(4)->Threads(16);自定义计数器
跟踪特定领域的指标,例如字节/秒或条目/秒。
state.SetItemsProcessed(state.iterations() * input.size());
state.SetBytesProcessed(state.iterations() * input.size() * sizeof(int));统计输出
使用 --benchmark_repetitions=10 运行,以获得平均值、中位数和标准差。该库会自动报告这些数据。
常见陷阱
请注意:
- 编译器删除“无效”代码 → 使用 DoNotOptimize
- 预热效应 → 测量许多次迭代
- CPU 频率缩放 → 固定 CPU 核心并禁用睿频
- 其他进程正在运行 → 在安静的机器上进行基准测试
批判性地解读数字
5% 的提升可能只是测量噪声。运行多次重复测试,只相信具有统计显著性的差异。与已知基线进行比较。
替代工具
其他微基准测试工具:
- Nonius — 仅含头文件的 C++ 基准测试库
- Hayai — 较旧但很轻量
- Catch2 内置基准测试支持
快速检查
为什么要在基准测试循环中使用 benchmark::DoNotOptimize(result)?
回顾
使用 Google Benchmark 进行细粒度测量。使用 DoNotOptimize 和 ClobberMemory 防止编译器耍花招。使用参数化和多线程基准测试,探索不同输入和并发条件下的行为。只相信具有统计显著性的差异。
常见问题解答
「使用 Google Benchmark 进行微基准测试」课时是免费的吗?
是的 — 「使用 Google Benchmark 进行微基准测试」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「使用 Google Benchmark 进行微基准测试」这节课中我会学到什么?
使用 Google Benchmark 编写可靠的微基准测试,并避免测量误区 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 Google Benchmark 进行微基准测试」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 缓存友好的数据布局
- 分支预测与热点循环
- 使用 perf、vtune 和 Sanitizer 进行性能分析
- 使用 Google Benchmark 进行微基准测试