欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在構(gòu)建時間方面Rust和C++究竟誰能更勝一籌呢?

jf_WZTOguxH ? 來源:Strager ? 2023-02-01 13:59 ? 次閱讀

谷歌 Chromium 規(guī)模的項目在新硬件上的構(gòu)建時間長達一小時,而在老硬件上的構(gòu)建時間更是達到了六個小時。雖然也有海量的調(diào)整方案能加速構(gòu)建速度,還有不少削減構(gòu)建內(nèi)容但極易出錯的捷徑供人選擇,再加上數(shù)千美元的云計算能力,Chromium 的構(gòu)建時間仍是接近十分鐘。這點我完全無法接受,人們每天都是怎么干活的???

有人說 Rust 也是一樣,構(gòu)建時間同樣令人頭疼。但事實就是如此,還是這僅僅是一種反 Rust 的宣傳手段?在構(gòu)建時間方面 Rust 和 C++ 究竟誰能更勝一籌呢?

構(gòu)建速度和運行時性能對我來說非常重要。構(gòu)建測試的周期越短,我編程就越高效、越快樂。我會不遺余力地讓我的軟件速度更快,讓我的客戶也越快樂。因此,我決定親自試試 Rust 的構(gòu)建速度到底怎么樣,計劃如下:

找一個 C++ 項目

把項目中的一部分單獨拿出來

逐行將 C++ 代碼重寫為 Rust

優(yōu)化 C++ 和 Rust 項目的構(gòu)建

對比兩個項目的構(gòu)建測試時間

我的猜想如下(有理有據(jù)的猜測,但不是結(jié)論):

Rust 的代碼行數(shù)比 C++ 少。C++ 中多數(shù)函數(shù)和方法都需要聲明兩次:一次在 header 里,一次在實現(xiàn)文件里。但 Rust 不需要,因此代碼行數(shù)會更少。

C++ 的完整構(gòu)建時間比 Rust 長(Rust 更勝一籌)。在每個.cpp 文件里,都需要重新編譯一次 C++ 的 #include 功能和模板,雖然都是并行運行,但并行不等于完美。

Rust 的增量構(gòu)建時間比 C++ 長(C++ 更勝一籌)。Rust 一個 crate(獨立可編譯單元)一編譯,但 C++ 是按文件編譯。因此代碼每次變動,Rust 要讀取的比 C++ 多。·

對此,大家怎么看呢

42% 的人認為 C++ 會贏,35% 同意“看情況”,另外 17% 的則覺得 Rust 會讓我們大吃一驚。

那么結(jié)果到底如何呢?下面讓我們進入正題。

編寫 C++ 和 Rust 的測試對象 找個項目

考慮到我未來一個月都要花在重寫代碼上,什么樣的代碼最合適?我認為得滿足以下幾點:

很少或不用第三方依賴(標(biāo)準(zhǔn)庫可以使用);

能在 Linux 和 macOS 上運行(我不怎么管 Windows 上的構(gòu)建時間);

大量測試套組(不然我沒法確定 Rust 代碼的正確性);

FFI(外部函數(shù)接口)、指針、標(biāo)準(zhǔn)或自定義容器、功能類和函數(shù)、I/O、并發(fā)、泛型、宏、SIMD(單指令多數(shù)據(jù)流)、繼承等等,多少都有使用。

其實答案也很簡單,直接找我前幾年一直在做的項目就行。我用的是一個 JavaScript 詞法分析器,quick-lint-js 項目。

quick-lint-js 的吉祥物 Dusty

截取 C++ 代碼

quick-lint-js 項目中 C++ 部分的代碼行數(shù)超過 10 萬,要把這些全改成 Rust 得花上我半年時間,不如只關(guān)注 JavaScript 詞法分析部分,其中涉及項目中的:

診斷系統(tǒng)

翻譯系統(tǒng)(用于診斷)

各種內(nèi)存分配器和容器(如 bump 分配器、適用于 SIMD 的字符串)

各種功能類函數(shù)(如 UTF-8 解碼器、SIMD 內(nèi)在包裝器)

測試的輔助代碼(如自定義斷言宏)

C 的 API

可惜這部分代碼里不涉及并發(fā)或 I/O,我測試不了 Rust 里 async/await 的編譯時間開銷,但這只是 quick-lint-js 項目里的一小部分,所以我還不用太擔(dān)心。

我首先把所有的 C++ 代碼都復(fù)制到新項目里,然后刪掉已知與詞法分析無關(guān)的部分,比如分析器和 LSP 服務(wù)器。我甚至一不小心刪多了代碼,最后不得不重新把這些代碼添了回去。在我不斷截代碼的過程中,C++ 的測試一直保持了通過狀態(tài)。

在徹底將 quick-lint-js 項目中涉及詞法分析的部分全截出來之后,項目中 C++ 的代碼大約有 1.7 萬行。

4f7f899e-a187-11ed-bfe3-dac502259ad0.png

重寫代碼

至于要怎么重寫這上千行的 C++ 代碼,我選擇按部就班:

找一個適合轉(zhuǎn)換的模塊;

復(fù)制黏貼代碼、測試、搜索替換并修改部分語法、繼續(xù)運行 cargo(Rust 的構(gòu)建系統(tǒng)和包管理器)測試直到構(gòu)建測測試都通過;

如果這個模塊依賴另一個模塊,那就找到被依賴的模塊,繼續(xù)進行第二步,然后再回到現(xiàn)在這個模塊;

如果還有模塊沒轉(zhuǎn)換,再回到第一步。

主要影響 Rust 和 C++ 構(gòu)建時間的問題在于,C++ 的診斷系統(tǒng)是通過大量代碼生成、宏、constexpr(常量表達式)實現(xiàn)的,而我在重寫 Rust 版時,則用了代碼生成、proc 宏、普通宏以及一點點 const 實現(xiàn)。傳聞 proc 宏速度很慢,也有說是因為代碼質(zhì)量太差導(dǎo)致的 proc 宏速度慢。希望我寫的 proc 宏還可以(祈禱~)。

我寫完才發(fā)現(xiàn),原來 Rust 項目比 C++ 項目還要大,Rust 代碼 17.1k 行,而 C++ 只有 16.6k 行。

4f848944-a187-11ed-bfe3-dac502259ad0.png

優(yōu)化 Rust 構(gòu)建

構(gòu)建時間很重要,因為我在截取 C++ 代碼之前就已經(jīng)做好了 C++ 項目構(gòu)建時間的優(yōu)化,所以我現(xiàn)在只需要對 Rust 項目的構(gòu)建時間做同樣的優(yōu)化即可。以下是我覺得可能會優(yōu)化 Rust 構(gòu)建時間的條目:

更快的鏈接器

Cranelift 后端

編譯器和鏈接器標(biāo)志

工作區(qū)與測試布局區(qū)分

最小化依賴功能

cargo-nextest

使用 PGO 自定義工具鏈

更快的鏈接器

我第一步要做的是分析構(gòu)建,我用的是 -Zself-profile rustc 標(biāo)志。在這個標(biāo)志所生成的兩個文件里,其中一個文件中的 run_linker 階段頗為突出:

4f8b16e2-a187-11ed-bfe3-dac502259ad0.png

第一輪 -Zself-profile 結(jié)果

之前我通過向 Mold 鏈接器的轉(zhuǎn)換成功優(yōu)化了 C++ 的構(gòu)建時間,那這套對 Rust 能否行得通?

Linux:鏈接器性能幾乎一致。(數(shù)據(jù)越小越好)

4f93948e-a187-11ed-bfe3-dac502259ad0.png

可惜,Linux 上雖然確實有提升,但效果不明顯。那 macOS 上的優(yōu)化又表現(xiàn)如何?在 macOS 上默認鏈接器的替代品有兩種,lld 和 zld,效果如下:

macOS:鏈接器性能幾乎不變。(數(shù)據(jù)越小越好)

4f9d75a8-a187-11ed-bfe3-dac502259ad0.png

可以看出,macOS 上替換默認鏈接器的效果同樣不明顯,我懷疑這可能是因為 Linux 和 macOS 上的默認鏈接器對我的小項目而言已經(jīng)做到了最好,這些優(yōu)化后的鏈接器(Mold、lld、zld)在大型項目上效果非常好。

Cranelift 后端

讓我們再回到 -Zself-profile 的另一篇報告上,LLVM_module_-codegen_emit_obj 和 LLVM_passes 階段頗為突出:

4fa50890-a187-11ed-bfe3-dac502259ad0.png

-Zself-profile 的第二輪結(jié)果

傳聞可以把 rustc 的后端從 LLVM 換成 Cranelift,于是我又用 rustc Cranelift 后端重新構(gòu)建了一遍,-Zself-profile 結(jié)果看起來不錯:

4fabaf92-a187-11ed-bfe3-dac502259ad0.png

使用 Cranelife 的 -Zself-profile 第二輪結(jié)果

可惜,在實際的構(gòu)建中 Cranelife 比 LLVM 慢。

Rust 后端:默認 LLVM 比 Cranelift 強。(測試于 Linux,數(shù)據(jù)越小越好)

4fb328e4-a187-11ed-bfe3-dac502259ad0.png

2023 年 1 月 7 日更新:rustc 的 Cranelift 后端維護者 bjorn3 幫我看了下為什么 Cranelift 在我的項目上效果不佳:可能是 rustup 的開銷導(dǎo)致的。如果繞過這部分 Cranelife 效果可能會有提升,上圖中的結(jié)果沒有采用任何措施。

編譯器和鏈接器標(biāo)志

編譯器里有一堆可以加快(或減緩)構(gòu)建速度的選項,讓我們一一試過:

-Zshare-generics=y (rustc) (Nightly only)

-Clink-args=-Wl,-s (rustc)

debug = false (Cargo)

debug-assertions = false (Cargo)

incremental = true 且 incremental = false (Cargo)

overflow-checks = false (Cargo)

panic = 'abort' (Cargo)

lib.doctest = false (Cargo)

lib.test = false (Cargo)

rustc 標(biāo)志:快速構(gòu)建優(yōu)于調(diào)試構(gòu)建。(測試于 Linux,數(shù)據(jù)越小越好)

4fbbf8f2-a187-11ed-bfe3-dac502259ad0.png

注:圖中的“quick, -Zshare-generics=y”與“quick, incremental=true”且啟用“-Zshare-generics=y”標(biāo)志相等同,其余柱狀圖沒有標(biāo)識“-Zshare-generics=y”是因為沒有啟用該標(biāo)志,后者意味著需要 nightly rust 編譯器。

上圖中使用的多數(shù)選項都有文檔可查,但我還沒找到有人寫過加 -s 的鏈接。子命令 -s 將包括 Rust 標(biāo)準(zhǔn)庫靜態(tài)鏈接在內(nèi)的所有調(diào)試信息全部剝離,讓鏈接器做更少的工作,從而減少鏈接時間。

工作區(qū)與測試布局

在文件的物理位置問題上,Rust 和 Cargo 都提供了部分靈活性。對我的項目而言,以下是三種合理布局:

4fc59394-a187-11ed-bfe3-dac502259ad0.png

理論上來說,如果我們把代碼拆成多個 crate,cargo 就可以并行化 rustc 的調(diào)用。鑒于我的 Linux 機器上有一個 32 線程的 CPU,macOS 機器上有一個 10 線程的 CPU,并行化應(yīng)該可以降低構(gòu)建時間。

對一個 crate 而言,Rust 項目中的測試有很多可運行的地方:

4fd1efcc-a187-11ed-bfe3-dac502259ad0.png

由于依賴周期的存在,我沒辦法做“源碼文件內(nèi)的測試”這個布局的基準(zhǔn),但其他布局組合里我都做了基準(zhǔn):

Rust 完整構(gòu)建:工作區(qū)布局最快。(測試于 Linux,數(shù)據(jù)越小越好)

4fdbb3cc-a187-11ed-bfe3-dac502259ad0.png

Rust 增量構(gòu)建:最佳布局不明。(測試于 Linux,數(shù)據(jù)越小越好)

4fe3f47e-a187-11ed-bfe3-dac502259ad0.png

工作區(qū)設(shè)置中,無論是分成多個可執(zhí)行測試(many test exes),還是合并成一個可執(zhí)行測試,似乎都能斬獲頭籌。所以后續(xù)我們還是按照“工作區(qū) + 多個可執(zhí)行文件”的配置吧。

最小化依賴功能

多個 crate 的拆分支持可選功能,而部分可選功能都是默認啟用的,具體功能可以通過 cargo tree 命令查看:

4feba17e-a187-11ed-bfe3-dac502259ad0.png

讓我們把 crate 之一,libc 中的 std 功能關(guān)掉,測試后再看看構(gòu)建時間有沒有變化。

Cargo.toml

 [dependencies]
+libc = { version = "0.2.138", default-features = false }
-libc = { version = "0.2.138" }

關(guān)掉libc功能后沒有任何變化。(測試于Linux,數(shù)據(jù)越小越好)

4ff36a62-a187-11ed-bfe3-dac502259ad0.png

構(gòu)建時間沒有任何變化,有可能 std 功能實際沒什么大影響。不管怎么說,讓我們進入下一個環(huán)節(jié)。

cargo-nextest

作為一款據(jù)說“比 cargo 測試快 60%”的工具,cargo-nextest 對于我這個代碼中 44% 都是測試的項目來說非常合適。讓我們來對比下構(gòu)建和測試時間:

Linux:cargo-nextest 減慢了測試速度。(數(shù)據(jù)越小越好)

4ffac050-a187-11ed-bfe3-dac502259ad0.png

在我的 Linux 機器上,cargo-nextest 幫了倒忙,雖然輸出不錯,不過……

示例 cargo-nextest 測試輸出:

PASS [   0.002s]        cpp_vs_rust::test_locale no_match
PASS [   0.002s]     cpp_vs_rust::test_offset_of fields_have_different_offsets
PASS [   0.002s]     cpp_vs_rust::test_offset_of matches_memoffset_for_primitive_fields
PASS [   0.002s] cpp_vs_rust::test_padded_string as_slice_excludes_padding_bytes
PASS [   0.002s]     cpp_vs_rust::test_offset_of matches_memoffset_for_reference_fields
PASS [   0.004s] cpp_vs_rust::test_linked_vector push_seven

那 macOS 上怎么說?

macOS:cargo-nextest 加快了構(gòu)建測試。(數(shù)據(jù)越小越好)

50001014-a187-11ed-bfe3-dac502259ad0.png

在我的 MacBook pro 上,cargo-nextest 確實提高了構(gòu)建測試的速度。但為什么 Linux 上沒有呢?難道是和硬件有關(guān)?

在下面測試中,我會在 macOS 上使用 cargo-nextest,但 Linux 上的測試不用。

使用 PGO 自定義工具鏈

我發(fā)現(xiàn) C++ 編譯器的構(gòu)建如果用配置文件引導(dǎo)的優(yōu)化(PGO,也稱作 FDO),會有明顯的性能提升。因此,讓我們試試用 PGO 優(yōu)化 Rust 工具鏈的同時,也用 LLVM BOLT 加上 -Ctarget-cpu=native 進一步優(yōu)化 rustc。

Rust 工具鏈:自定義工具鏈?zhǔn)亲羁斓?。(測試于 Linux,數(shù)據(jù)越小越好)

500f4534-a187-11ed-bfe3-dac502259ad0.png

如果你好奇的話,可以看看這段工具鏈構(gòu)建腳本??赡懿贿m用于你的機器,但只要我能運行就行:https://github.com/quick-lint/cpp-vs-rust/blob/953429a4d92923ec030301e5b00face1c13bb92b/tools/build-toolchains.sh

與 C++ 編譯器相比,通過 rustup 發(fā)布的 Rust 工具鏈似乎已經(jīng)是優(yōu)化完成的結(jié)果。PGO 加上 BOLT 的組合只帶來了不到 10% 的性能提升。但有提升就是好的,所以在后續(xù)與 C++ 的競爭中我們會繼續(xù)使用這個速度最快的工具鏈。

我第一次搭建的 Rust 自定義工具鏈比 Nightly 還要慢 2%,我在 Rust config.toml 的各種選項中反復(fù)調(diào)整,不斷交叉檢查 Rust 的 CI 構(gòu)建腳本以及我自己的腳本,最終在好幾天的掙扎后才讓這二者性能持平。在我最終潤色這篇文章時,我進行了 rustup 更新,拉取 git 項目,并重頭又建了一遍工具鏈。結(jié)果這次我的自定義工具鏈速度更快了!有可能是我在 Rust 倉庫里提交錯了代碼……

優(yōu)化 C++ 構(gòu)建

在最初的 C++ 項目 quick-lint-js 中,我已經(jīng)用常見的手段優(yōu)化了編譯時間,比如用 PCH、禁用異常和 RTTI、調(diào)整編譯標(biāo)志、刪除非必要 #include、將代碼從頭中移出、外置模板實例等方法。但此外還有一些 C++ 編譯器和鏈接器我沒試過,在我們進入 C++ 和 Rust 的對比之前,先從這些里面挑出最適合我們的。

Linux:自定義 Clang 是最快的工具鏈。(數(shù)據(jù)越小越好)

501b860a-a187-11ed-bfe3-dac502259ad0.png

很明顯,Linux 上的 GCC 是個特例,而 Clang 的表現(xiàn)則要好上很多。我自定義構(gòu)建的 Clang(和 Rust 工具鏈一樣,也是用 PGO 和 BOLT 構(gòu)建的)相較于 Ubuntu 的 Clang,顯著優(yōu)化了構(gòu)建時間,而 libstdc++ 的構(gòu)建略快于平均 libc++ 的速度。

那我的自定義 Clang 加上 libstdc++ 在 C++ 和 Rust 的對比中表現(xiàn)如何呢?

macOS:Xcode 是最快的工具鏈。(數(shù)據(jù)越小越好)

5021bce6-a187-11ed-bfe3-dac502259ad0.png

在 macOS 上,搭配 Xcode 的 Clang 工具鏈似乎要比 LLVM 網(wǎng)站上的 Clang 工具鏈優(yōu)化得更好。

C++20 模塊

我的 C++ 代碼用的是 #include,但如果用 C++20 中新增加的 import 又會怎么樣呢?C++20 的模塊是不是理論上來說應(yīng)該會讓編譯速度超級快?

我在項目了嘗試過 C++20 模塊,但直到 2023 年的 1 月 3 日,Linux 上的 CMake 模塊支持過于實驗性質(zhì)了,我甚至連“hello world”都沒跑起來。

或許 2023 年中 C++20 模塊會大放異彩,對于我這種超級在意構(gòu)建時間的人來說,真是這樣就太好了。但目前為止,我還是繼續(xù)用經(jīng)典 C++ 的 #include 和 Rust 做對比吧。

對比 C++ 和 Rust 的構(gòu)建時間

通過把 C++ 項目改寫成 Rust,并盡可能地優(yōu)化 Rust 的構(gòu)建時間后,問題來了:C++ 和 Rust 究竟誰更快呢?

很可惜,答案是“看情況”!

Linux:Rust 部分情況下構(gòu)建速度超越 C++。(數(shù)據(jù)越小越好)

502adb5a-a187-11ed-bfe3-dac502259ad0.png

在我的 Linux 機器上,部分情況下 Rust 的構(gòu)建速度確實優(yōu)于 C++,但也有速度持平或遜于 C++ 的情況。在增量 lex 的基準(zhǔn)上,我們修改了大量源碼,Clang 比 rustc 速度快,但在其他增量基準(zhǔn)上,rustc 又會反超 Clang。

macOS:C++ 構(gòu)建速度通??煊?Rust。(數(shù)據(jù)越小越好)

503aad6e-a187-11ed-bfe3-dac502259ad0.png

但我的 macOS 機器上情況卻截然不同。C++ 的構(gòu)建速度常常快上 Rust 許多。在增量測試 utf-8 的基準(zhǔn),我們修改中等數(shù)量測試文件,rustc 編譯速度會略微超過 Clang,但在包括全量構(gòu)建等其他基準(zhǔn)上,Clang 很明顯效果要更好。

超過 17k 行代碼

我基準(zhǔn)測試的項目只有 17k 行代碼,算是小型項目,那么對超過 10 萬行代碼的大型項目來說,又是什么情況呢?

我把最大的模塊,也就是詞法分析器的代碼復(fù)制粘貼了 8、16 以及 24 遍,分別用來測試。因為我的基準(zhǔn)里也包括了運行測試的時間,我覺得構(gòu)建時間即使是對于那些能瞬間構(gòu)建完的項目,也應(yīng)該會線性增長。

50430c66-a187-11ed-bfe3-dac502259ad0.png

倍數(shù)擴大后 C++ 完整構(gòu)建優(yōu)于 Rust。(測試于 Linux,數(shù)據(jù)越小越好)

504c0654-a187-11ed-bfe3-dac502259ad0.png

倍數(shù)擴大后 C++ 增量構(gòu)建優(yōu)于 Rust。(測試于 Linux,數(shù)據(jù)越小越好)

5052a626-a187-11ed-bfe3-dac502259ad0.png

Rust 和 Clang 確實都是線性擴大,這點很好。

正如預(yù)期中一樣,修改 C++ 的頭文件,也就是增量 diag-type 會大幅影響構(gòu)建時間。而由于 Mold 鏈接器的存在,其他增量基準(zhǔn)中構(gòu)建時間的擴展系數(shù)很低。

Rust 構(gòu)建的擴展性讓我很失望,即使只是增量 utf-8 測試的基準(zhǔn),無關(guān)文件的加入也不應(yīng)該讓它的構(gòu)建時間如此受影響。測試所用的 crate 布局時“工作區(qū)且多個可執(zhí)行測試”,因此 utf-8 測試應(yīng)該能獨立編譯可執(zhí)行文件。

結(jié) 論

編譯時間對 Rust 而言算是問題嗎?答案是肯定的。雖然也有一些可以加快編譯速度的提示和技巧,但卻沒有效果非常顯著的數(shù)量級改進,這讓我在開發(fā) Rust 時非常高興。

Rust 的編譯時間和 C++ 相比呢?確實也很糟。至少對我的編碼風(fēng)格來說,Rust 在大型項目上開發(fā)的編譯時間甚至更加遠比 C++ 還要糟糕。

再回過頭看看我當(dāng)初的假設(shè),幾乎全軍覆沒:

Rust 改寫版代碼行數(shù)比 C++ 多;

在全量構(gòu)建上,C++ 相比 Rust 在 1.7 萬行代碼上構(gòu)建時間相似,在 10 萬行代碼上構(gòu)建時間要少;

在增量構(gòu)建上,Rust 相比 C++ 在部分情況構(gòu)建時間要短,在 1.7 萬行上構(gòu)建時間要長,在 10 萬行代碼上構(gòu)建時間甚至更長。

我不爽嗎?確實。在改寫過程中,我不斷學(xué)習(xí)著 Rust 相關(guān)的知識,比如 proc marco 能替代三個不同代碼生成器,簡化構(gòu)建流水線,讓新開發(fā)者們?nèi)兆痈眠^。但我完全不想念頭文件,以及 Rust 的工具類真的很好用,特別是 Cargo、rustup 以及 miri。

但我決定不把 quick-lint-js 項目中剩下的代碼也改成 Rust,但如果 Rust 的構(gòu)建時間能有明顯優(yōu)化,或許我會改變主意。當(dāng)然,前提是我還沒被 Zig 迷走心神。

附注

源碼

刪減后的 C++ 項目源碼、移植版 Rust(包括不同的項目布局)、代碼生成腳本和基準(zhǔn)測試腳本、GPL-3.0 及以上。

Linux 機器

名稱:strapurp
CPU:AMD Ryzen 9 5950X (PBO; stock clocks) (32 threads) (x86_64)
RAM:G.SKILL F4-4000C19-16GTZR 2x16 GiB (overclocked to 3800 MT/s)
操作系統(tǒng):Linux Mint 21.1
內(nèi)核:Linux strapurp 5.15.0-56-generic #62-Ubuntu SMP Tue Nov 22 1914 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Linux 性能治理器:schedutil
CMake:版本 3.19.1
Ninja:版本 1.10.2
GCC:版本 12.1.0-2ubuntu1~22.04
Clang(Ubuntu):版本 14.0.0-1ubuntu1
Clang (自定義):版本 15.0.6(Rust fork; 代碼提交 3dfd4d93fa013e1c0578-d3ceac5c8f4ebba4b6ec)libstdc++ for Clang:版本 11.3.0-1ubuntu1~22.04
Rust 穩(wěn)定版:1.66.0 (69f9c33d7 2022-12-12)
Rust Nightly:版本 1.68.0-nightly (c7572670a 2023-01-03)
Rust(自定義):版本 1.68.0-dev (c7572670a 2023-01-03)
Mold:版本 0.9.3 (ec3319b37f653dccfa4d-1a859a5c687565ab722d)
binutils:版本 2.38

macOS 機器

名稱:strammer
CPU:Apple M1 Max (10 threads) (AArch64)
RAM:Apple 64 GiB
操作系統(tǒng):macOS Monterey 12.6
CMake:版本 3.19.1
Ninja:版本 1.10.2
Xcode Clang:Apple clang 版本 14.0.0 (clang-1400.0.29.202) (Xcode 14.2)
Clang 15:版本 15.0.6 (LLVM.org website)
Rust 穩(wěn)定版:1.66.0 (69f9c33d7 2022-12-12)
Rust Nightly:版本 1.68.0-nightly (c7572670a 2023-01-03)
Rust(自定義):版本 1.68.0-dev (c7572670a 2023-01-03)
lld:版本 15.0.6
zld:代碼提交 d50a975a5fe6576ba0fd-2863897c6d016eaeac41

基準(zhǔn)

用 deps 的構(gòu)建和測試
C++:cmake -S build -B . -G Ninja && ninja -C build quick-lint-js-test && build/test/quick-lint-js-test 計時
Rust:cargo fetch 未計時,再用 cargo test 計時

不用 deps 的構(gòu)建和測試
C++:cmake -S build -B . -G Ninja && ninja -C build gmock gmock_main gtest 未計時, 再用 ninja -C build quick-lint-js-test && build/test/quick-lint-js-test 計時
Rust:cargo build --package lazy_static --package libc --package memoffset" 未計時, 再用 cargo test 計時

增量 diag-types
C++:構(gòu)建和測試未計時,隨后修改 diagnostic-types.h,再用 ninja -C build quick-lint-js-test && build/test/quick-lint-js-testRust:構(gòu)建和測試未計時,修改 diagnostic_types.rs 后,cargo test

增量 lex
同增量 diag-types,但使用 lex.cpp/lex.rs

增量 utf-8 測試
同增量,但使用 test-utf-8.cpp/test_utf_8.rs

每個可執(zhí)行基準(zhǔn)均采用 12 個樣本,棄置前兩個,基準(zhǔn)僅顯示最后十個樣本的平均性能。誤差區(qū)間展示最小與最大樣本間區(qū)別。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 解碼器
    +關(guān)注

    關(guān)注

    9

    文章

    1152

    瀏覽量

    40960
  • SIMD
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    10341
  • UTF-8
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    7875
  • LSP
    LSP
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    9831
  • rust語言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3031

原文標(biāo)題:我用 Rust 改寫了自己的C++項目:這兩個語言都很折磨人!

文章出處:【微信號:AI前線,微信公眾號:AI前線】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Oculus Rift與PS VR:誰會更勝一籌

    對于用戶來說,究竟Oculus Rift和PlayStation VR誰更勝一籌?我們來進行下對比。
    發(fā)表于 03-21 15:12 ?1270次閱讀

    射頻技術(shù)和射頻標(biāo)識對比分析誰更勝一籌?

    都說射頻技術(shù)什么的,還有種叫做射頻標(biāo)識?這兩者有什么不同,兩者之間有什么聯(lián)系,誰更勝一籌?射頻(RF)是Radio Frequency的縮寫,表示可以輻射到空間的電磁頻率,頻率范
    發(fā)表于 10-30 07:53

    Si整流器與SiC二極管:誰會更勝一籌

    Si整流器與SiC二極管:誰會更勝一籌
    發(fā)表于 06-08 06:14

    生物識別技術(shù)有哪幾種?到底哪種會更勝一籌?

    生物識別技術(shù)是什么?生物識別技術(shù)有哪幾種?到底哪種生物識別技術(shù)更勝一籌
    發(fā)表于 06-28 08:25

    為何現(xiàn)在的串行通信傳輸方式會更勝一籌

    為何現(xiàn)在的串行通信傳輸方式會更勝一籌?串行通信要比并行通信的速度更高嗎?
    發(fā)表于 10-15 09:09

    公共云與私有云大比拼 成本計算誰更勝一籌?

    如今,計算公共云成本與私有云成本時,IT專業(yè)人員有個新的資產(chǎn),以幫助他們應(yīng)用量化的數(shù)據(jù)來找到他們的答案。個更簡單的計算可能有助于確定企業(yè)實施云計算最具成本意識的地方。 公共云與私有云大比拼 成本計算誰
    發(fā)表于 11-11 09:55 ?1123次閱讀

    華為P10上線預(yù)售!華為P10對比iPhone7,誰將更勝一籌?

    根據(jù)華為官方的消息,本周的3月24號,將會舉行華為P10和P10plus的發(fā)布會,屆時,讓眾多花粉期待已久的P10將會亮相,據(jù)網(wǎng)上的消息,這款手機的配置也是相當(dāng)給力的,華為P10對比Iphone7 ,誰又能更勝一籌?
    發(fā)表于 03-20 16:59 ?981次閱讀
    華為P10上線預(yù)售!華為P10對比iPhone7,誰將<b class='flag-5'>更勝一籌</b>?

    努比亞M2今日發(fā)布,對比小米6s,誰能更勝一籌?

    今天,努比亞又發(fā)布了兩款M系列新機,努比亞M2和M2青春版,據(jù)悉,這兩款手機的主打領(lǐng)域是拍照和續(xù)航功能,3630mAh的電池,加上后置1300萬的雙攝,配上機身的設(shè)計風(fēng)格,亮點確實不少,但是對比即將發(fā)布的小米6,誰又能更勝一籌?
    發(fā)表于 03-21 23:28 ?2619次閱讀

    小米電視4 55吋與雷鳥I55參數(shù)對比,誰能更勝一籌?

    那有沒有小伙伴好奇這兩款智能電視究竟更勝一籌?本期內(nèi)容,小編就為大家?guī)硇∶纂娨? 55吋與雷鳥I55的參數(shù)對比。
    發(fā)表于 05-24 15:51 ?3343次閱讀

    串行傳輸方式都比并行傳輸方式更勝一籌

    無論從通信速度、造價還是通信質(zhì)量上來看,現(xiàn)今的串行傳輸方式都比并行傳輸方式更勝一籌。
    的頭像 發(fā)表于 12-22 10:05 ?7231次閱讀
    串行傳輸方式都比并行傳輸方式<b class='flag-5'>更勝一籌</b>

    微軟、谷歌、英特爾都發(fā)力AI,3巨頭誰更勝一籌?

    這個五月科技界巨頭微軟、谷歌、英特爾先后舉辦開發(fā)者大會,這三次大會最大的共同點就是AI,都是他們大力發(fā)展的領(lǐng)域,那么三巨頭誰更勝一籌?
    發(fā)表于 05-28 14:23 ?1880次閱讀

    各項生物識別技術(shù)中,哪種識別技術(shù)更勝一籌?

    據(jù)估算,到2020年生物識別技術(shù)市場規(guī)模將達到250億美元,5年內(nèi)年均增速約14%。其中,人臉識別增速最快,將從2015年的9億美元增長到2020年的24億美元。生物識別市場為何如此之大?各項生物識別技術(shù)中,哪種識別技術(shù)更勝一籌?
    發(fā)表于 09-28 17:27 ?1512次閱讀

    MelNet 捕捉“高層結(jié)構(gòu)”更勝一籌

    捕捉“高層結(jié)構(gòu)”方面更勝一籌——說話者的聲音中包含了微妙的致性,而這幾乎無法用文字描述,但是人的耳朵很好地辨別出來。
    的頭像 發(fā)表于 07-18 15:13 ?3296次閱讀

    安規(guī)電容與薄膜電容大比拼,究竟更勝一籌?

    帶來了比較好的反響,很多人不知道它的優(yōu)勢在哪里,下面就看看弗瑞鑫小編給大家分享:安規(guī)電容與薄膜電容大比拼,究竟更勝一籌? 安規(guī)電容是不是比薄膜電容要好,是不能單從簡單的方面來看,它們有不同的用途,不同的應(yīng)用
    的頭像 發(fā)表于 04-04 17:42 ?2406次閱讀

    UVLED面光源與傳統(tǒng)光源對比:誰更勝一籌?

    之間的對比結(jié)果又如何?本文將對UVLED面光源與傳統(tǒng)光源進行全面對比,以揭示誰更勝一籌。 、能耗對比 能耗方面,UVLED面光源相較于
    的頭像 發(fā)表于 05-10 15:28 ?759次閱讀
    UVLED面光源與傳統(tǒng)光源對比:誰<b class='flag-5'>更勝一籌</b>?