效能工程

可重現的基準測試(控制頻率縮放)

你替你最佳化過的函式計時:8.2 毫秒。再跑一次:9.7 毫秒。又一次:7.9 毫秒。你的改動有幫助嗎,還是機器只是吵雜?如果「同一段」程式碼的兩次量測差了 20%,你就無法相信你以為看到的 5% 改善。可重現的基準測試就是把環境釘死、好讓同一段程式碼給出同一個數字、讓真正的改動從雜訊中凸顯出來的紀律。

這種漂移最大的單一來源是動態頻率縮放。現代 CPU 不以固定時脈執行:為省電它在閒置時放慢(頻率縮放/省電調速器),為短暫衝刺它把時脈提升到基準之上(turbo/boost)——但 turbo 受溫度與有多少核心在忙所限,所以同一段程式碼會依晶片多熱、以及還有什麼在跑,而以不同時脈速度執行。在涼爽的 turbo 衝刺期間量測,它看起來快;在晶片發熱降頻後量測,它看起來慢。對策很具體:固定 CPU 頻率(把調速器設成 performance、或停用 turbo,使時脈恆定),並在計時前暖機。除了頻率,還要控制其他雜訊來源:把基準綁到特定核心(CPU affinity),最好把那些核心從排程器與中斷中隔離出來,讓別的工作無法搶佔它;停用超執行緒,使一個同伴執行緒不會偷走資源;讓機器安靜(關掉背景行程);考慮定址空間佈局隨機化(它會讓效能逐次跑變動),方法是跑很多次試驗;並在多次重複上回報一個穩健的統計量(中位數加一個高百分位),而非單一的最佳或平均數字。目標是:原封不動地重跑基準能重現結果。

它之所以重要,是因為一個不穩定的基準會產生有信心的胡說:你「確認」了其實是雜訊的改善、又丟棄了真正的改善,而且沒人能在另一台機器上重現你的數字。誠實的張力:一個最大程度受控的基準(固定時脈、隔離核心、沒有其他負載)是公平比較兩個程式版本的正確方式,但它「不是」你的軟體在正式環境中執行的環境,那裡 turbo、吵雜的鄰居與爭用都是真實的。所以用一個受控的設置把改動歸因到你的程式碼,再用一個獨立的、類正式環境的量測去了解它在真實世界中實際如何表現——並且永遠回報條件,因為一個沒有附環境的基準數字,依定義就是不可重現的。

# 固定頻率,使 turbo/降頻無法扭曲計時 $ sudo cpupower frequency-set --governor performance # 把基準綁到一個被隔離的核心,遠離其他工作 $ taskset -c 3 ./bench # 然後在多次執行上回報中位數 + p99,而非單一數字

兩個核心控制:固定頻率的調速器移除 turbo/降頻漂移,CPU 綁定移除排程器干擾。

一個最大程度受控的基準能公平比較兩個程式版本,卻「不」代表正式環境,那裡 turbo 與吵雜鄰居都是真的——用受控的執行歸因改動,用類正式環境的執行預測真實行為。永遠回報條件。

又称
controlling turbo and noisestable benchmark environmentpinning and isolation控制 turbo 與雜訊穩定的基準環境