GitHub 專案「headstart」透過修改 rustc 和 cargo,允許依賴套件在依賴項完成完整類型檢查之前開始編譯,從而顯著縮短大型 Rust 專案的編譯時間。傳統上,Rust 編譯器要求每個套件必須等待其依賴項完全檢查完畢(包含函數主體)後才能開始,但 headstart 讓 rustc 在介面檢查完成時立即寫入早期元數據文件(.early-rmeta),並讓 cargo 基於此早期元數據啟動依賴項的編譯。這使得下游套件的函數主體檢查能與上游套件的編譯並行進行。

在 rustc 預設前端下,對 13 個真實專案(包括 rust-analyzer, zed, bevy, lemmy, polars 等)進行乾淨構建時,headstart 使 `cargo check` 速度提升最高達 54%,`cargo build` 速度提升最高達 42%,且無任何專案變慢。若使用平行前端(-Zthreads=8),額外增益最高為 25%。這些數據基於 16 核心機器;由於增益來自利用原本閒置的核心,因此在較小機器上效果會減弱。例如在 4 核心機器上,rust-analyzer 的檢查速度提升 24%,構建速度提升 13–15%。

技術實現涉及 rustc 的 `-Zearly-metadata` 標誌(6 個補丁)和 cargo 的 `-Zheadstart` 標誌(3 個補丁)。rustc 新增 `analysis_interfaces` 查詢以拆分介面與函數主體分析,並在兩者之間寫入 `.early-rmeta`。cargo 則負責傳遞標誌、基於早期元數據通知啟動依賴項、在等待完整元數據時釋放工作槽位,並確保僅在所有依賴項成功後才報告輸出。若函數主體出現錯誤,構建仍會失敗,診斷訊息與退出狀態與現行版本相同,僅進度訊息與 JSON 訊息順序可能不同。成本包括下游丟棄的工作、錯誤報告延遲以及更高的記憶體使用量。

事件背景

Rust 編譯流程傳統上要求嚴格順序:每個套件必須等待其依賴項完全通過類型檢查後才能開始編譯。然而,類型檢查僅需依賴項的介面元數據(存於 .rmeta 文件),無需函數主體。Headstart 利用這一機制,在介面檢查完成時立即輸出一個部分元數據文件,從而允許下游套件並行開始其自身的分析。該專案旨在成為上游 rustc 和 cargo 的拉取請求,目前以補丁系列形式存在,並提供了詳細的設計文檔、測量結果及準備就緒評估。

社群觀察

社群討論集中在該技術整合到主線編譯器的潛力以及與現有工具的比較。用戶 swiftcoder 表示期待看到該技術進入主線編譯器的路徑。用戶 hmokiguess 將其與 TypeScript 生態中的 Turborepo 進行比較,詢問是否類似於緩存概念。用戶 scoopr 提出了一個關於泛型方法實例化的相關想法,並指出原本以為類似機制已在較後階段實現。用戶 WalterGR 指出在另一篇關於「2026年9月如何加速 Rust 編譯器」的文章提交中,有一個包含潛在缺點討論的有趣評論線程。用戶 tristenharr 則簡單地讚賞這是一個好主意。