Skip to content

Benchmark 方法论参考卡

这是 ch01 全章的速查页。本卷后续每一篇性能文章和性能 Lab,开头都会回引这一页讲的那套规矩,就像 vol5 用 TSan 贯穿并发正确性。这不是教程(教程是 ch01-01 到 ch01-05),是 reference card,贴墙上看的那种。

§0 前提(一句话)

性能是随机变量,不是数。 你测出来的一定是一个分布,要采样 + 统计推断,不能跑一次记个数。(详见 ch01-01)

§1 测量前:环境就绪(micro A/B 场景)

必做命令 / 做法
锁 CPU governorsudo cpupower frequency-set -g performance
关 TurboBIOS,或锁频
绑核taskset -c <某个核> ./bench(别挑 0 号)
NUMA 绑节点numactl --cpunodebind=0 --membind=0 ./bench
perf 可用sudo sysctl -w kernel.perf_event_paranoid=1
编译选项RelWithDebInfo(-O2 -g)+ profiling 加 -fno-omit-frame-pointer
体检bash perf-env-check.sh(见 ch01-03,只查不改)

⚠️ 这些只在 micro A/B 场景做。评估生产性能时全部不做:要复刻真实(保留 DFS、邻居、ASLR),用统计处理噪声。见 ch01-05。

§2 写可信 microbenchmark

要点做法
用框架,别手搓Google Benchmark 主力、nanobench 轻量补(讲微架构时即时反馈)
防 DCEbenchmark::DoNotOptimize(x) 钉结果到内存/寄存器;注意:不防 x 自身被常量传播算掉,所以输入必须是运行期数据
强制写落内存benchmark::ClobberMemory() 兜底
扫参数->RangeMultiplier(2)->Range(8, 8<<10);state.SetComplexityN(...) 自动拟合 big-O
重复聚合->Repetitions(3)->ReportAggregatesOnly(true) 报 mean/median/stddev/cv
墙钟->UseRealTime()(多线程必加)

详见 ch01-02(含完整可运行例子和真实输出)。

§3 报告与比较

  • 必报:中位数、IQR 或 95% CI、cv、样本数、环境快照(内核 / CPU / governor / perf_event_paranoid)。
  • 禁报:单次均值(性能数据右偏,长尾拉偏均值)。
  • A/B:同环境、同二进制(只改一处)、多次重复(N ≥ 30);假设检验默认 Mann-Whitney U(非参数,性能数据几乎不正态),先验正态才用 t-test。
  • 报效应量:「快 12%(95% CI [10%, 14%], p<0.01)」这种完整说法,不只甩一个 p 值。统计显著 ≠ 工程有意义。
  • 双峰分布是信号不是噪声:混了两种行为(cache hit/miss、锁竞争),拆开分别测。

详见 ch01-04。

§4 micro vs 生产/CI(边界,不许混)

场景做什么产出
micro A/B消除噪声,干净对比两个实现「改动方向对不对」
生产测量复刻真实噪声,telemetry 采分位数(p90/p99),统计 A/B「用户实际快了吗」
CI 回归变点检测(E-Divisive)/ PMC 指纹(AutoPerf),自动开 ticket「有没有悄悄退化」

禁跨场景换算:micro 的 30% 提升不会等比例带到生产。见 ch01-01、ch01-05。

§5 vol6 文章 / Lab 引用规范

  • 每篇性能文章、每个性能 Lab,开头声明「本文遵循 ch01 测量方法论」。
  • 报性能数字时,附环境快照 + 统计量(中位数 / cv / 重复次数),不报单次裸值。
  • 涉及 A/B 时,用 §3 那套(同环境同二进制 + Mann-Whitney + 效应量)。

§6 perf 速查

bash
# 基础计数(体检:看 IPC、cache miss、branch miss)
perf stat -r 5 ./bench
perf stat -e cycles,instructions,cache-misses,branch-misses ./bench

# 采样 profile(找热点;务必 -fno-omit-frame-pointer 或用 dwarf 解栈)
perf record -F 99 -g --call-graph dwarf -- ./bench
perf report                      # 交互式看
perf script | stackcollapse-perf.pl | flamegraph.pl > out.svg   # 火焰图

# 微架构归因(ch03 详谈)
toplev -l3 taskset -c 0 ./bench  # TMAM 四桶下钻,需 pmu-tools

火焰图、TMAM、toplev 的完整工作流是 ch03(归因方法论)的活,这里只给入口。

参考资源(教程正文)

  • ch01-01「为什么 microbenchmark 会骗你」
  • ch01-02「怎么写一个可信的 microbenchmark」
  • ch01-03「测量陷阱与环境就绪:16 条 checklist」
  • ch01-04「统计与报告:把分布变成结论」
  • ch01-05「生产测量与 CI 性能回归检测」
  • Bakhvalov, D. 《Performance Analysis and Tuning on Modern CPUs》第 2 章
  • Google Benchmark user_guide、Brendan Gregg perf / FlameGraphs

v0.7.1-2-g3718060 · 3718060 · 2026-07-06