0Pricing
C++ Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 缓存友好的数据布局
  2. 分支预测与热点循环
  3. 使用 perf、vtune 和 Sanitizer 进行性能分析
  4. 使用 Google Benchmark 进行微基准测试
← 返回 C++ Academy