均值和中位数不一致是有原因的
表格同时给出两者,两者之间的差距是最值得先看的东西。如果均值明显高于中位数,说明少数几次慢速运行把平均值拉高了——可能是一次 GC 停顿、一阵缓存失效风暴,或者操作系统临时把别的任务调度到了你的核心上。中位数会忽略这些,均值不会。
哪个才「对」并没有定论。如果你要按稳态吞吐量来规划服务器容量,均值才是重点,因为那些慢速运行确实消耗了真实时间。如果你在比较两种实现、判断哪个算法更好,中位数通常更公平,因为离群值衡量的是你的机器而不是你的代码。你在推理哪个就引用哪个,并且明确说明用的是哪个。
标准差告诉你这次比较是否成立
均值的差异只有在相对于离散程度足够大时才有意义。两组分别是 12.0 和 12.4 毫秒、标准差 0.05,那是真实的差异。同样两个均值、标准差是 3.0,那就是同一个数字换了顶帽子,从中得出的任何结论都只是噪音。
本工具使用样本标准差,除以 n-1 而不是 n。这里这样做是正确的:你的这些运行是从「所有可能运行」这个总体中抽出的样本,而不是总体本身,除以 n 会系统性地低估离散度。只有一次运行时不存在离散度,该列显示 0——这也提醒你:一次测量不叫基准测试。
相对倍数才是别人会记住的数字
最后一列把每组表示为最快那组的倍数,因为结果通常就是以这种形式被复述的。「新解析器快 2.4 倍」能传播开;「新解析器平均 8.2 毫秒」传不开,除非听的人已经知道基准值。
两点提醒。第一,这个比值继承了背后两个均值的全部不确定性,所以在数据噪声大的情况下 1.05 倍的差距根本不算差距。第二,「均值之比」和「比值之均值」不是一回事,如果各次运行的规模差异很大,两者甚至可能指向相反的方向。数字接近时,请把离散度和倍数一起报出来,让读者自己判断。