新聞中心
rust/warp 比 go/fasthttp 要快數(shù)倍
上周我發(fā)現(xiàn)了關(guān)于超性能的帖子。它表示 rust tokio/hyper 性能高于 go http。這是意料之中的,但有一條評論與 fasthttp 相比,其中 rust 的表現(xiàn)稍差。
我們提供的服務有:網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、墨脫ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的墨脫網(wǎng)站制作公司
我決定自己執(zhí)行基準測試。使用以下命令在 AWS r5n.8xlarge實例上執(zhí)行所有基準測試:
go/fasthttp 代碼:
生銹/扭曲代碼:
請注意,需要額外的標頭來匹配 fasthttp 實現(xiàn)。
初始基準測試結(jié)果
去/快速http:
生銹/翹曲:
fasthttp 比 rust 版本高出 10% 左右!
優(yōu)化 rust 版本
很少有已知的技巧可以使 rust 版本更好地工作。讓我們一步一步地應用它們,看看我們能走多遠。
啟用 LTO
LTO 是一種鏈接時優(yōu)化,可減少生成的二進制大小并提高性能。了解有關(guān) LTO 的更多信息。
與初始版本相比,我們獲得了 +5% 的收益。
使用 Jemalloc
默認情況下,rust 代碼使用 libc 內(nèi)存分配器,通常不建議將其用于高負載的關(guān)鍵應用程序。有很多替代分配器。根據(jù)我的經(jīng)驗,jemalloc 在性能和內(nèi)存利用率方面是最好的。了解有關(guān)使用 jemalloc 的更多信息。
與 LTO 版本相比,我們得到了 +1.8%。
啟用不穩(wěn)定的管道
帶有wrk 的Benchmark是一個非常簡單的 HTTP/1 小明文測試。這種基準有一些細節(jié)。讓我們unstable_pipeline在 warp 實例上啟用。
與 LTO+jemalloc 版本相比,我們獲得了額外的 +3.8%。
太好了,在這一步我們已經(jīng)超越了 fasthttp!
修復一些 tokio
讓我們檢查一下火焰圖,看看運行代碼是否有明顯的無效性。我不會發(fā)布它,以免敘述過多。
引起我注意的特殊功能是wake0 (見這里)。
該wakers數(shù)組是在每個函數(shù)調(diào)用上創(chuàng)建的,用于收集所有需要通知并實際通知它們的喚醒者。我開始使用這段代碼,并意識到減少會NUM_WAKERS提高性能!讓我們在這里注意,它是一個數(shù)組(不是 vec),它是在堆棧上分配的,所以不會發(fā)生分配。性能不足的原因是rust在初始化數(shù)組時,會將None值復制到數(shù)組的每個槽中。NUM_WAKERS當增加時,這會導致減速。
我們獲得了額外的 +2.8%,并且以 3.7% 的成績超過了 go/fasthttp!
什么做得不好
我嘗試了更多技巧,但沒有顯示出有意義的影響:
Rust 和 Go,哪個性能更好?
要說性能,那是Rust更好。更多的編譯期優(yōu)化、無 GC 等特點加持,開發(fā)高性能應用自然是 Rust 性能高。據(jù)統(tǒng)計利用 Rust 開發(fā)的 RipGrep 性能甚至賽過使用 C 開發(fā)的 Grep。
但是性能不是唯一考量,當你糾結(jié) Borrow Check,糾結(jié) unsafe,糾結(jié) copy clone,糾結(jié)各種奇怪的類型限制的時候;當你 cargo build 怒草電腦風扇三分鐘的時候;人家 GoLang 可能早就發(fā)兩個版了。
同時 Rust 的語法花活眾多,遍歷數(shù)組可以寫循環(huán)也可以 for_each() 一行流。不像 GoLang 那么白開水誰寫都差不多一個味道,經(jīng)常第一天想到神來之筆快樂 Coding 到半夜第二天爬起來發(fā)現(xiàn)昨晚寫的都甚么東西看不懂不如蜘蛛爬,這是墜痛苦的!
Go 的編譯器為了個編譯速度快連循環(huán)不變式提升、循環(huán)展開、對齊等等優(yōu)化一個都不做,函數(shù)內(nèi)斂一堆限制大多數(shù)情況都不做(比如函數(shù)里有個 for 或者 defer 或者 select 等,或者函數(shù)多于 40 個表達式),擁有的優(yōu)化一只手都能數(shù)的過來:
基礎(chǔ)優(yōu)化欠缺,高級優(yōu)化更是一個沒有,和在 Debug 配置編譯下的 -O0 優(yōu)化的 C++ 差不多一個概念(而且跑得更慢),哪來的資本和 rust 比性能。
其他方面:
而且 Go 的 GC 吞吐量也很低,大多數(shù)情況下各方面 Go 跑的甚至都比 Java 更慢。只不過得益于 AOT 編譯的設(shè)計,相比 Java 而言除了內(nèi)存占用小和啟動速度快之外就沒有任何優(yōu)勢了,比較適合拿來做性能不關(guān)鍵的命令行工具。
個人還是更喜歡 Rust。
對比 Go 語言,Rust 有什么優(yōu)勢和劣勢?
我并沒有什么編程的經(jīng)驗,覺得編程實在是太復雜了,不喜歡去研究太多,對這個也不怎么懂,只能說自己是個半吊子,就是所掌握的知識,也是東拼西湊的,朋友和我說點兒,自己去書上看一點兒,只能說根據(jù)自己的體驗給出一些體會吧。
Rust的優(yōu)勢是:
1、Rust把安全、精確的內(nèi)存管理作為一切的中心放在首要的位置。
2、Rust同時擁有特別強的控制性和特別強的安全性。
3、Rust語言通過: 優(yōu)秀的類型系統(tǒng)設(shè)計、 嚴格的編譯器靜態(tài)審查、 配合程序員局部核對、加上少量的運行時校驗,保障了內(nèi)存安全。
4、Rust的語言特別的復雜,導致學習曲線比較陡峭,對于初學者來說難度較大。但學通之后將終生受益。
5、效率高,速度特別的快
6、 支持范型
7、 社區(qū)活躍度很高,更加的強調(diào)了社區(qū)的作用。
8、Rust 有更強的語義,更容易捕獲錯誤的邏輯,編譯器直接檢查出你代碼中的不安全的部分
Rust的劣勢是:
1、 語言相對來說比較復雜,對于新手來說,讓新手摸不著頭腦。
2、還不算太穩(wěn)定。
其實我覺得什么代碼啊編程啊這些東西還是比較適合理工的學生去研究,我一看腦袋就大,完全不明白在講什么。我大概了解的就是這些,語言的話大家可以多方面的去了解,也不是說有缺點就是不好,看配置看個人吧,每個人習慣不一樣,也許有的人用不穩(wěn)定的還覺得挺好呢,有的人就喜歡比較完美的,在我看來編程這個東西真的是很復雜,會有很多的代碼,這些代碼弄得我自己頭都大了,有的時候還得去惡補一下。
當前標題:rust語言還沒go快 rust語言 沒前景
分享URL:http://ef60e0e.cn/article/ddgdjhe.html