去掉提前跳出動作:讓巨量程式碼大小寫折疊達到儲存體速度
為何重要
GitHub 此案展示了極致軟體最佳化背後的硬體與編譯器課題:Data-dependent control flow 會嚴重阻礙現代 CPU 編譯器的 SIMD 向量化,開發者應重新審視 canonical form 處理流水線的設計。對於需要處理大規模文本的開發者而言,這個 Rust crate 提供了一個實務上值得參考的高效能解決方案範本。
GitHub 超過 4.8 TB 的程式碼資料量需要在全文索引前執行大小寫折疊,他們透過開源 Rust 函式庫「casefold」來加速這個耗時的基本運算,關鍵在於移除了傳統上會阻礙向量化的「中斷/提早跳出」判斷邏輯。
- GitHub 內部的 Blackbird 搜尋引擎索引超過 1.8 億個儲存庫(近乎 4.8 TB 的原始碼),每次查詢比對都需要執行大小寫折疊。
- 該 Rust crate 僅實作簡單的 1 對 1 折疊(忽略像 ß→ss 或土耳其語的特殊變體),以保持與 ripgrep 等常用工具的一致性。
- 移除非 ASCII 字元的檢查後,利用 Apple M4 硬體執行,通過 LLVM 向量化,使輸送量達到超過 45 GiB/s,接近儲存體頻寬極限。
- 實測顯示,在純量程式碼中,移除分支後反而效能下降(2.6 GiB/s),只有在向量化後無分支寫入才顯著加速(>45 GiB/s)。