编程 基准测试的单一分数,是一个没人同意的加权

2026-09-07 21:11:16

基准测试的单一分数,是一个没人同意的加权

先披露利益关系(这也是最该让你警惕地读下去的部分):作者卖基准里九个 WordPress 备份插件之一,它目前排第二。他做这个基准是想回答一个简单问题:哪个 WordPress 备份插件最快?两个插件在相同站点上做字节一致的固定快照、备份与恢复在无外网容器里跑、每组配对做一次热身加三次测量、结果喂进 Elo 评级

测量是容易的部分。难的是弄清楚页面顶部的那个数字有没有资格存在

两个轴互相矛盾,而且不是偶然

每次运行产出两件值得比的东西:备份耗时多久、压缩包多大。按各自排序得到两个排名,Kendall's tau 是 -0.50——不是"不相关",是主动对立。整个赛场上,备份最快的插件写出了最大的包。说穿了很直白:压缩花 CPU 时间,跳过压缩换回秒数、付出字节。不太直白的是它对排行榜做了什么:按速度排名,就是在按"谁压缩得最少"排名——不是某个插件的怪癖,是九个里普遍存在的规则。

九个里六个是 Pareto 最优:没有其他插件在速度与体积两个轴上同时胜出。只有三个在两个轴上都被击败、可以诚实地称为更差。其余六个,"更好"是约束问题,不是软件问题。所以发布的任何单一排名数字,都是对两个互相矛盾的轴的一次加权——作者在替你选加权、把它应用到你的决策上、还不告诉你。

早有定论:严肃基准机构有规则

SPEC 的 Fair Use 规则整节讲"派生值"(derived value):任何"基准指标加别的东西"的函数。复合值明确允许,不允许的是把它当成基准自己的指标展示。他们的例子:游戏协会用两个 SPEC 基准的加权子集合成 "GamePerfMark",SPEC 裁定:复合值可能有用有趣,但加权与子集选择是协会做的而非 SPEC 做的,把它叫 "SPECgame" 就是违规。

同文档里另外两条规则在干活:比较基础必须说明——不是"最快",是"在什么范围内、怎么测的、何时取的"里最快;多个基准要求头条数字必须附带规定指标,让讨喜的数字无法单独出行。这不是抽象的道德说教,是"数字离开测量页面后如何被滥用"的描述,出自看了三十年的人之手。

第二个数字过度自信的地方:误差棒

排名是一个问题,排名旁边的置信区间是另一个——它来自一个真实 bug。教科书近似:CI = 1.96 * (400 / sqrt(n)),n 是对局数。5 局 ±351,50 局 ±111,200 局 ±55——局数越多区间越紧。这个公式假设每局是独立观测

然后作者看到一条记录:40 局里 24 局失败,24 局全是同一个 bug 复现出来的同一个故障。这是关于插件的一个事实,被观测了 24 次,不是 24 个事实。按 24 喂进 sqrt(n),得到的是证据不支撑的精度。修复是聚类抽样设计效应(cluster-sampling design effect),取最保守的形式:共享同一根因的结果视为完全相关,任意大小的簇只计一次——effectiveSampleSize 把同一根因的失败簇折叠成一次观测,误差棒才诚实。

实践建议

发布任何基准排行前自问三句:我是否在替读者选加权?(多轴互斥时,给原始分轴数据而非单一复合分);置信区间是否假设了不存在的独立性?(同一 bug/同一次故障/同一机器批次的结果要按簇计);数字离开页面后会被怎么用?(附带比较基础与必报指标,学 SPEC 的做法)。单分数是妥协,诚实的方式是给轴、给误差、给上下文。

来源:Your benchmark's single score is a weighting nobody agreed to - DEV Community

复制全文 生成海报 性能 基准测试 统计

推荐文章

程序员茄子在线接单