這是一篇來自?https://benw.is/posts/how-i-improved-my-rust-compile-times-by-seventy-five-percent?的總結和翻譯,我去掉了一些不太重要的章節,保留了所有關鍵技術點。
Rust經常被提到的一個痛點是編譯時間較慢。為了享受借用檢查器、安全性和零成本抽象等好處,我們需要花費更多時間進行編譯。為了測試不同的更改,我們需要建立一個基準。我電腦的配置如下:
AMD 5950x processor,
72GB RAM
SATA SSD system drive.
7200RPM spinning disk storage drives
NVME drives
NixOS linux distro
Rust 1.75 nightly
Optimization Level
這些建議來自 Bevy,它建議在開發過程中將優化級別設置得更高,以可能減少開發編譯時間并提高性能。默認情況下,Rust 編譯器為開發構建設置了優化級別為 0。我們將為我們的代碼設置優化級別為 1,并為我們代碼的所有依賴設置優化級別為 3。
[profile.dev]
opt-level = 1
[profile.dev.package."*"]
opt-level = 3
這樣做有一個缺點是如果錯誤來自依賴庫,那么錯誤消息會少得多。因此,如果遇到棘手的錯誤,你可能需要調整優化級別。
Mold
Rust 編譯器的基本步驟大致如下,首先讀取源代碼,將其轉換為多種類型的 IR(中間表示),并在轉換過程中執行優化。然后將該 IR 傳遞給由 LLVM 提供的代碼生成器,該代碼生成器將 IR 轉換為目標文件,然后鏈接器將這些目標文件和其他系統庫鏈接在一起,形成一個可執行二進制文件。關于它的更多詳細信息可以在這里?找到。這是一篇非常棒的閱讀材料,但對于我們在這里的討論來說可能有些太深了。
Mold 是由Rui Ueyama開發的新鏈接器,旨在通過盡可能并行化加載來提高鏈接器性能,基準測試顯示其比 Rust 的默認鏈接器快得多。
對于 Linux 和 Mac,默認的鏈接器是 ld,由 cc 運行。Windows 則使用微軟的 MVC link.exe。如果你在 Linux上運行,可以直接使用 mold。如果你在 Mac上,有一個名為 Sold 的付費版本可供使用。如果 Mold 為你帶來了好處,我鼓勵你購買 Sold(價格非常實惠)或在他的 Github 贊助頁面上贊助 Rui。遺憾的是,目前不支持 Windows 用戶。Sold 對 Windows 的支持正在開發中。
在 Linux 上,實際上非常容易使用,只需安裝 Mold,然后在 cargo 命令前加上?mold -run
?。例如,?mold -run cargo build
?。也可以在?.cargo/config.toml
?中啟用,就像這樣:
[target.x86_64-unknown-linux-gnu]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=/path/to/mold"]
/path/to/mold
?是模具可執行文件的絕對路徑。這也是啟用 Sold 的方式,只需用 Sold 路徑替換模具路徑,并將目標更改為 Mac 的編譯目標。
Cranelift
在上面的優化中,我們替換了 Rust 編譯器使用的鏈接器。現在讓我們嘗試替換代碼生成器,Cranelift 是一種替代代碼生成器,在構建步驟中代替了 LLVM。雖然它不擅長進行像 LLVM 那樣的許多優化,但它擅長快速生成代碼。最近,它作為 Rust 1.73 夜間版的 x86_64 linux 目標代碼生成進行了集成。其他平臺需要單獨設置 cranelift,請參閱它的 README。
rustup update nightly #install nightly if you haven't already
rustup component add rustc-codegen-cranelift-preview --toolchain nightly
要在?Cargo
?中使用它,可以通過啟用不穩定的?codegen-backend
?功能,并為配置文件設置?codegen-backend= "cranelift"
?值來啟用它。可以在?.cargo/config.toml
?中這樣做:
[unstable]
codegen-backend = true
[profile.server-dev]
codegen-backend = "cranelift"
當然,你也可以只對某個目標啟用:
[target.x86_64-unknown-linux-gnu]
rustflags = ["-Zcodegen-backend=cranelift"]
需要注意的是,Cranelift 仍在開發中,可能存在一些缺少內在功能的問題。因此,部分 crate 可能無法在正常地工作。如果您發現缺少什么功能,我鼓勵您提交 Issue,可能會有可用的解決方法。
Conclusion
經過一系列的測試和評判(可以看原文),我們發現啟用?Mold
?和?Cranelift
?為我帶來了 75% 的增量編譯時間縮短和 25% 的冷編譯時間縮短,這是相當大的改進。使用 Cranelift 需要 Nightly 版本的 Rust,這可能會讓一些項目感到不理想,而且 Mold 需要 Linux,而 Sold 需要 Mac(并且需要付費),對我來說,這進一步證明了Rust Web 開發應該在某種 Linux 或 Mac 上進行,而不是在 Windows 上。WSL2 可能有助于改善情況,但可能會更慢。由于我有一臺 Mac 筆記本和一臺 Linux 工作站,我將為我的 Mac 購買 Sold,并在可以的項目中使用Cranelift。
From 日報小組 Koalr
社區學習交流平臺訂閱:
Rustcc論壇: 支持rss
微信公眾號:Rust語言中文社區