dsh-batch-regression: Run the same command N times, use the median instead of a single result to draw conclusions.

前言

做过性能调优的人大多遇到过这种情况:跑一次基准测试,输出 1200ms;换个时间再跑,变成 1900ms。改了一行代码想验证有没有变快,跑一次觉得快了,再跑一次又觉得是错觉。单次结果带着环境噪声,直接拿它下结论不可靠。

DSH 的理念是「一切皆插件」,这类问题也有对应的插件来解。下面介绍 PangYiMing 维护的 dsh-batch-regression:把同一条命令跑 N 轮,取中位数和分布,用统计而不是单次结果下结论。

这是什么

dsh-batch-regression 是一个 DeepSeek Harness(DSH)插件,定位一句话:对同一命令跑 N 轮,输出样本数、中位数及最小/最大值,帮你从抖动的数据里取出可信的那个数。

它解决三类问题:

  • 性能数据抖动,取可信中位数;
  • 改前/改后耗时分布对比;
  • 偶现问题看复现率。

许可证为 MIT。

核心功能

插件的能力可以拆成四点:

1、轮数可配置。通过 ROUNDS 指定跑多少轮,输出样本数、中位数及最小/最大值。

2、两种度量方式。METRIC=time 测量耗时,输出 median/min/max;METRIC=success 统计成功率或复现率,输出形如 PASS=9/10 的结果。

3、中间失败不中断。某一轮 fail 了就记一条 FAIL,继续跑完剩下的轮次,不会因为单轮失败停掉整个流程。

4、结论有纪律。插件作者在 README 里沉淀了几条实测方法论:至少 5 轮(少于 5 轮的统计没意义)、取中位数而不是平均(平均会被极值拉偏)、改前/改后差距超过 20% 才下结论。

安装与启用

从 GitHub 安装,执行:

dsh plugin --profile demo add github:PangYiMing/dsh-batch-regression

README 还提供了 npm 安装方式,但注明是「发布到 npm 后」可用:

dsh plugin --profile demo add dsh-batch-regression

典型用法

先看测耗时的例子。下面这条命令把 node bench.js 跑 5 轮,输出样本数、中位数和最小/最大值:

ROUNDS=5 METRIC=time ./scripts/runner.sh "node bench.js"
# samples=5  median=1234ms  (min=1102ms max=1987ms)

再看统计复现率的例子。下面这条命令把 npm run build 跑 10 轮,统计成功次数,适合排查偶现失败:

ROUNDS=10 METRIC=success ./scripts/runner.sh "npm run build"
# PASS=9/10

执行纪律与已知局限

插件 README 里写了几条实测沉淀的方法论,用之前建议先看一遍:

1、至少 5 轮。少于 5 轮的统计没意义。

2、取中位数,不是平均。平均会被极值拉偏,中位数更稳。

3、差距 > 20% 结论才稳。改前/改后对比,差距超过 20% 再下结论,否则宁可多跑几轮。

4、控制变量。同一台机器、同一时段,关掉浏览器/IDE 等大头进程再跑。

5、承认抖动来源。Apple Silicon 的 P/E 核动态调度会让单次耗时翻倍,笔记本连续跑十几分钟会热降频,这些都会影响单次耗时。

其中有一条实测教训值得单独说明:作者试过 cpulimit/nice/taskpolicy 这类限制 CPU 的手段来消抖,在 Apple Silicon 上实测全失效。所以这个插件的消抖思路是「多轮取中位数 + 控制变量」,不靠限制 CPU。

适用场景与注意

适合用这个插件的三种情况:

  • 性能数据抖动,想取一个可信中位数;
  • 改前/改后对比耗时分布;
  • 偶现问题看复现率(用 METRIC=success)。

不适合的情况也要说清楚:

  • 单次就能判定的事,直接跑一次就行;
  • 定位「哪次提交引入退化」是 git bisect 的活,作者另有 dsh-bisect-debug 插件;
  • UI 视觉回归用 dsh-screenshot-diff。

另外提醒一点:DSH 插件以当前 dsh 进程的权限运行,安装前建议先检查插件源码和许可证。dsh-batch-regression 的源码在 GitHub 上,许可证为 MIT,装之前可以自己过一遍。

结尾

性能数据忽高忽低时,与其反复跑单次然后凭感觉挑一个数,不如让插件跑够轮数、取中位数、再看分布。dsh-batch-regression 把这套做法固化成了两条命令,配合「至少 5 轮」「差距 > 20% 才下结论」这几条纪律,结论会稳很多。

  • 社区目录页:https://www.skillhub.cn/plugins/PangYiMing/dsh-batch-regression
  • GitHub 仓库:https://github.com/PangYiMing/dsh-batch-regression
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye