第12章 基准测试:不是跑出数字,而是先让数字可信

基准测试的重点不在数字大小,而在实验设计是否能支撑结论。

本页目录

跑出一个数字,不等于得到一个结论

第 12 章先拦住 benchmark 里最危险的误会:数字出来了,就以为结论也出来了。

benchmark 最会骗人的地方,不是不会跑,而是特别容易跑出一个“看起来很像答案”的数字。

先把实验可信度拆开

一个结果能不能拿去做工程决策,至少要过这几关:

  • 工作负载像不像真实场景
  • 变量有没有控制住
  • 预热和稳态有没有分开
  • 不同轮次能不能比较
  • 平均值、尾延时、吞吐和资源代价有没有一起看

只过了一两关,结果都还不稳。

别拿一次跑快了 20% 就宣布优化成功

最常见的错法有四种:

  • 只跑一次,就开始下结论
  • 测的是 A,报告里却说成 B
  • 只看平均值,不看尾延时和资源代价
  • 微基准跑得很好,就直接外推到真实系统

这些错法都在把“实验结果”夸大成“工程现实”。

什么时候一个 benchmark 才更可信

下面这些条件同时成立时,结果才更值得信:

  • 工作负载代表性站得住
  • 实验变量控制得住
  • 多轮结果稳定,不只是单次好运气
  • 结果变化和资源代价能一起解释
  • 换一个相近场景后,结论不会立刻翻车

少了其中几项,就先把结果当线索。

一个最典型的错法:优化前后差了 20%,就宣布优化成功

现场里很常见:某次改动后数字提升了 20%,于是报告里开始写“性能优化完成”。

但这个结论里可能还缺很多东西:

  • 工作负载是不是偏了
  • 预热是不是没跑稳
  • 尾延时是不是反而更差了
  • CPU、内存、I/O 代价是不是变高了

如果这些都没补,那个 20% 很可能只是局部数字,不是工程答案。

先把实验条件、结果和外推边界分开记

先写一张 benchmark 检查表

每次实验前先过这 5 项:

  1. 工作负载是否代表真实场景。
  2. 变量是否控制住。
  3. 预热和正式采样是否分开。
  4. 多轮结果是否稳定。
  5. 吞吐、尾延时和资源代价是否一起记录。

结果一好看,先补反向检查

一旦看到“明显提升”,先补:

  • 反向对照
  • 多轮重复
  • 资源代价
  • 尾延时变化

先防止自己被好看的数字骗了。

跑出分数不等于测试结束,真正稳的做法是“边跑边看”。benchmark 在跑的时候,底层观测也要同时挂着;如果你没法证明目标系统真的被推到了极限,那很可能只是跑分工具自己的单线程瓶颈先到了头。

微基准和真实系统分开写

以后做报告时,把“微基准结果”和“真实场景结果”分成两栏写,不要混成一个结论。

漂亮数字也先别急着信,最好再拿硬件天花板做一轮合理性检查。比如 IOPS 一换算成吞吐量,已经明显超出当前网卡或总线的物理带宽上限,那说明你根本没打穿设备,而是全命中了缓存;凡是打破物理常识的跑分,先按假象处理。

实验可信以后,再看 perf 该不该上

第 12 章解决的是“实验结果能不能信”。第 13 章接着回到工具边界,先看 perf 该在什么条件下上场。