均值和中位數不一致是有原因的
表格同時給出兩者,兩者之間的差距是最值得先看的東西。如果均值明顯高於中位數,說明少數幾次慢速執行把平均值拉高了——可能是一次 GC 停頓、一陣快取失效風暴,或者作業系統臨時把別的任務排程到了你的核心上。中位數會忽略這些,均值不會。
哪個才「對」並沒有定論。如果你要按穩態吞吐量來規劃伺服器容量,均值才是重點,因為那些慢速執行確實消耗了真即時間。如果你在比較兩種實現、判斷哪個演算法更好,中位數通常更公平,因為離群值衡量的是你的機器而不是你的程式碼。你在推理哪個就引用哪個,並且明確說明用的是哪個。
標準差告訴你這次比較是否成立
均值的差異只有在相對於離散程度足夠大時才有意義。兩組分別是 12.0 和 12.4 毫秒、標準差 0.05,那是真實的差異。同樣兩個均值、標準差是 3.0,那就是同一個數字換了頂帽子,從中得出的任何結論都只是噪音。
本工具使用樣本標準差,除以 n-1 而不是 n。這裡這樣做是正確的:你的這些執行是從「所有可能執行」這個總體中抽出的樣本,而不是總體本身,除以 n 會系統性地低估離散度。只有一次執行時不存在離散度,該列顯示 0——這也提醒你:一次測量不叫基準測試。
相對倍數才是別人會記住的數字
最後一列把每組表示為最快那組的倍數,因為結果通常就是以這種形式被複述的。「新解析器快 2.4 倍」能傳播開;「新解析器平均 8.2 毫秒」傳不開,除非聽的人已經知道基準值。
兩點提醒。第一,這個比值繼承了背後兩個均值的全部不確定性,所以在資料噪聲大的情況下 1.05 倍的差距根本不算差距。第二,「均值之比」和「比值之均值」不是一回事,如果各次執行的規模差異很大,兩者甚至可能指向相反的方向。數字接近時,請把離散度和倍數一起報出來,讓讀者自己判斷。