前言¶
做過性能調優的人大多遇到過這種情況:跑一次基準測試,輸出 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