【Rust日報】2023-11-21 如何將 Rust 的編譯效率提高 75%

這是一篇來自?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語言中文社區

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161352.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161352.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161352.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pikachu靶場Table pikachu.member doesn’t exist:解決

背景: 第一次搭建pikachu靶場,搭建好后訪問index.php后,嘗試練習,發現界面顯示Table pikachu.member doesn t exist,后來找了很多教程,沒有解決,后來發現是自己沒有進行初始化,給大家…

VMware 系列:ESXI6.7升級7.0

ESXI6.7升級7.0 一、下載補丁二、上傳文件三 啟用Shell四、登錄Shell后臺五、刪除不兼容驅動六、正常升級最近,將一臺使用ESXI6.7的虛擬機升級到了7.0版本,下面記錄一下自己的升級過程。 升級條件 首先確保硬件是否能升級到7.0版本,物理網卡驅動為e1000e不能升級,如果是ig…

不到十個例題帶你拿下c++雙指針算法(leetcode)

移動零問題 https://leetcode.cn/problems/move-zeroes/submissions/ 1.題目解析 必須在原數組進行修改,不可以新建一個數組 非零元素相對順序不變 2.算法原理 【數組劃分】【數組分塊】 這一類題會給我們一個數組,讓我們劃分區間,比如…

【機器學習】Nonlinear Independent Component Analysis - Aapo Hyv?rinen

Linear independent component analysis (ICA) x i ( k ) ∑ j 1 n a i j s j ( k ) for all i 1 … n , k 1 … K ( ) x_i(k) \sum_{j1}^{n} a_{ij}s_j(k) \quad \text{for all } i 1 \ldots n, k 1 \ldots K \tag{} xi?(k)j1∑n?aij?sj?(k)for all i1…n,k1…K()…

VUE語法-$refs和ref屬性的使用

1、$refs和ref屬性的使用 1、$refs:一個包含 DOM 元素和組件實例的對象,通過模板引用注冊。 2、ref實際上獲取元素的DOM節點 3、如果需要在Vue中操作DOM我們可以通過ref和$refs這兩個來實現 總結:$refs可以獲取被ref屬性修飾的元素的相關信息。 1.1、$refs和re…

PS_魔幻

首先打開一個背景圖片 然后ctrl j復制一層背景 在調整中將圖片改成黑白顏色 點擊調整中的 色相/飽和度 調整明度 點擊畫筆工具,并且設置畫筆模板 調節畫筆大小,將筆記本電腦涂個概況 然后再新建色相/飽和度 勾選著色 調節背景顏色至喜歡 右鍵混合選項 …

04-React腳手架 集成Axios

初始化React腳手架 前期準備 1.腳手架: 用來幫助程序員快速創建一個基于xxx庫的模板項目 1.包含了所有需要的配置(語法檢查、jsx編譯、devServer…)2.下載好了所有相關的依賴3.可以直接運行一個簡單效果 2.react提供了一個用于創建react項目的腳手架庫…

【華為OD機試python】分糖果【2023 B卷|100分】

【華為OD機試】-真題 !!點這里!! 【華為OD機試】真題考點分類 !!點這里 !! 題目描述 小明從糖果盒中隨意抓一把糖果,每次小明會取出一半的糖果分給同學們。 當糖果不能平均分配時,小明可以選擇從糖果盒中(假設盒中糖果足夠) 取出一個糖果或放回一個糖果。 小明最少需要多…

【喵叔閑扯】---小談靜態類和單例模式

靜態類(Static Class)和單例(Singleton)都是在編程中用于實現特定類型的設計模式或代碼組織方式。它們在不同的情境下有不同的用途和特點。 靜態類(Static Class) 靜態類是一種類,它的方法和屬性…

一鍵去水印免費網站快速無痕處理圖片、視頻水印

水印問題往往是一個大麻煩。即使我們只想將這些照片保留在我們的個人相冊中以供懷舊,水印也可能像頑固的符號一樣刺激我們的眼睛。為了解決這個問題,我們需要不斷探索創新的解決方案,讓我們深入研究一款強大的一鍵去水印免費網站“水印云”。…

Rust并發編程:理解線程與并發

大家好!我是lincyang。 今天我們來深入探討Rust中的并發編程,特別是線程的使用和并發的基本概念。 Rust中的線程 Rust使用線程來實現并發。線程是操作系統可以同時運行的最小指令集。在Rust中,創建線程非常簡單,但與此同時&…

ubuntu 系統 怎么判斷系統有沒有GPU

在 Ubuntu 系統中,您可以通過幾種方式來檢查系統是否包含顯卡,以及顯卡的詳細信息。以下是一些常用的方法: lspci 命令: 打開終端。輸入 lspci | grep VGA 命令。這將顯示系統中所有的 VGA 兼容設備,通常是您的顯卡。 …

二叉搜索樹java實現

顧名思義,二叉搜索樹是一棵二叉樹,每個節點就是一個對象,這個對象包含屬性left、right和parent。left指向節點的左孩子,right指向節點的右孩子,parent指向節點的父節點(雙親)。如果某個孩子節點…

scala的類介紹

scala的類、抽象類、接口、對象 class :類, 通過new關鍵字來實例化,每次實例化都會創建一個新的對象;用來定義普通的類。object:對象,用來定義一個單例對象的,它只有一個實例,且在程序運行期間…

黑馬點評筆記 redis實現緩存

文章目錄 什么是緩存?為什么要使用緩存 如何使用緩存功能實現緩存模型和思路代碼實現 緩存更新策略數據庫緩存不一致解決方案代碼實現 什么是緩存? 緩存(Cache),就是數據交換的緩沖區,俗稱的緩存就是緩沖區內的數據,一般從數據庫中獲取,存儲于本地代碼(例如: 例1:Static fi…

vr小鼠虛擬解剖實驗教學平臺減少了受感染風險

家畜解剖實驗教學是培養畜牧獸醫專業學生實際操作能力的專業教學活動中的核心手段。采取新型教學方式與手段,合理設置實驗教學內容,有助于激發學生的操作積極性,促進實踐教學的改革。 家畜解剖VR仿真教學是一種借助VR虛擬現實制作和web3d開發…

常用通信接口、協議:SCCB

一、概述 SCCB(串行攝像頭控制總線)是由歐姆尼圖像技術公司(OmniVision)開發的一種類IIC的總線,主要用于其OV系列的圖像傳感器上(但目前有很多家的圖像傳感器都有采用該控制總線)。相對于IIC總線來說SCCB與之最主要的差…

java基礎-集合

1、集合 在java中,集合(Collection)指的是一組數據容器,它可以存儲多個對象,并且允許用戶通過一些方法來訪問與操作這些對象。j 集合的實現原理都基于數據結構和算法,如下: 數據結構&#xff1…

振南技術干貨集:制冷設備大型IoT監測項目研發紀實(2)

注解目錄 1.制冷設備的監測迫在眉睫 1.1 冷食的利潤貢獻 1.2 冷設監測系統的困難 (制冷設備對于便利店為何如何重要?了解一下你所不知道的便利店和新零售行業。關于電力線載波通信的論戰。) 2、電路設計 2.1 防護電路 2.1.1 強電防護 …

基于JavaWeb+SSM+Vue教學輔助微信小程序系統的設計和實現

基于JavaWebSSMVue教學輔助微信小程序系統的設計和實現 源碼獲取入口前言主要技術系統設計功能截圖Lun文目錄訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 前言 1.1 概述 隨著信息時代的快速發展,互聯網的優勢和普及,人們生活…