基准测试对比表

粘贴多组实现的原始耗时数据,一键得到均值、中位数、标准差、最小值、最大值和相对倍数的对比表,并可导出 Markdown 表格。

把一堆耗时数据变成一张对比表。 每行一组:名称、冒号、原始测量值。工具会算出常用统计量,以最快的一组为基准排出相对倍数,并生成可直接贴进 PR 的 Markdown 表格。

每行写成「名称: 数值, 数值, 数值」。逗号、分号、空格都可以作为分隔符。

分组 次数 均值 中位数 标准差 最小 最大 相对倍数

至少输入一行「名称: 1, 2, 3」格式的数据才能生成对比表。

看懂基准测试表,不被数字误导

均值和中位数不一致是有原因的

表格同时给出两者,两者之间的差距是最值得先看的东西。如果均值明显高于中位数,说明少数几次慢速运行把平均值拉高了——可能是一次 GC 停顿、一阵缓存失效风暴,或者操作系统临时把别的任务调度到了你的核心上。中位数会忽略这些,均值不会。

哪个才「对」并没有定论。如果你要按稳态吞吐量来规划服务器容量,均值才是重点,因为那些慢速运行确实消耗了真实时间。如果你在比较两种实现、判断哪个算法更好,中位数通常更公平,因为离群值衡量的是你的机器而不是你的代码。你在推理哪个就引用哪个,并且明确说明用的是哪个。

标准差告诉你这次比较是否成立

均值的差异只有在相对于离散程度足够大时才有意义。两组分别是 12.0 和 12.4 毫秒、标准差 0.05,那是真实的差异。同样两个均值、标准差是 3.0,那就是同一个数字换了顶帽子,从中得出的任何结论都只是噪音。

本工具使用样本标准差,除以 n-1 而不是 n。这里这样做是正确的:你的这些运行是从「所有可能运行」这个总体中抽出的样本,而不是总体本身,除以 n 会系统性地低估离散度。只有一次运行时不存在离散度,该列显示 0——这也提醒你:一次测量不叫基准测试。

相对倍数才是别人会记住的数字

最后一列把每组表示为最快那组的倍数,因为结果通常就是以这种形式被复述的。「新解析器快 2.4 倍」能传播开;「新解析器平均 8.2 毫秒」传不开,除非听的人已经知道基准值。

两点提醒。第一,这个比值继承了背后两个均值的全部不确定性,所以在数据噪声大的情况下 1.05 倍的差距根本不算差距。第二,「均值之比」和「比值之均值」不是一回事,如果各次运行的规模差异很大,两者甚至可能指向相反的方向。数字接近时,请把离散度和倍数一起报出来,让读者自己判断。

全部计算在浏览器本地用原生 JavaScript 完成,不依赖第三方库,不上传数据,不做追踪。

常见问题

测量数据需要什么格式?
每组一行:名称、冒号,然后是数字。逗号、分号、空格和制表符都算分隔符,所以大多数直接复制来的输出无需修改即可使用。
单位选择框会做换算吗?
不会,它只影响输出的标注。统计量完全按你输入的原始数字计算,因此页面上所有分组必须事先统一到同一个单位。
为什么只有一次运行时标准差是 0?
样本标准差除以 n-1,当 n 为 1 时结果为零。单次测量本就没有离散度可言,这个 0 是在提示你应该多跑几次。
「相对倍数」是怎么算的?
用每组的均值除以页面上最小的均值。最快的那组直接标注为「最快」而不是显示 1.00 倍,因为导出表格时这样更好读。
能直接粘贴基准测试工具的输出吗?
通常可以。只要每行有名称、冒号和一些数字,多余的标点会被当作分隔符处理。没有冒号的行会被跳过,不会报错。
Markdown 表格能直接贴到 PR 里吗?
可以,它是标准的 GitHub 风格 Markdown,含表头行和分隔行。列标题跟随页面语言,如果需要英文表头请先切换语言。