天天看點

亞馬遜發文力捧Rust,Go 技術負責人:别“拉踩”我們!

作者 | 褚杏娟

近日,亞馬遜官方部落格上釋出 “Sustainability with Rust” 一文,通過研究和對比來說明了 Rust 在可持續性方面優于其他語言。随後,ZDNet 也對此文進行了報道。在 ZDNet 的報道發出之後,Go 技術負責人 Russ Cox 連發 14 條推特,表示該文章在嚴重誤導大家對 Go 語言的認知。

這件事引起了大家的關注,同時也引發了“Rust 還是 Go”的大讨論。那麼,究竟發生了什麼?

一篇文章引發的“對線”

在亞馬遜,Rust 已經成為大規模建構基礎設施的關鍵。2019 年,亞馬遜成為 Rust 項目的贊助商。2020 年開始招聘 Rust 維護者和貢獻者,并與谷歌、華為、微軟和 Mozilla 聯合成立了 Rust 基金會。

争議 1:幾年前的研究有偏差

在發表的“Sustainability with Rust”文章中,為驗證 Rust 是一種節能的程式設計語言,使用了 2017 年的一項研究資料進行證明。這項研究主要是對 27 種程式設計語 進行 10 個基準問題測試,并測量執行時間、能耗和峰值記憶體使用情況。以下為文章中引起争議的第一個部分:

幾年前有一項非常有趣的研究,主要探索能源消耗、性能和記憶體使用之間的關系。這是關于可持續發展的常見話題。我們對服務的能源或碳使用的了解很少,是否有代理名額?是否可以檢視現有基礎設施成本、性能、記憶體等服務儀表闆,并通過觀察到的趨勢來推測服務的能源消耗趨勢?

該研究在 27 種不同的程式設計語言中進行了 10 個基準測試,并測量了執行時間、能耗和峰值記憶體使用的情況。C 和 Rust 在能效方面明顯優于其他語言。事實上,它們的效率大約比 Java 高 50%,比 Python 高 98%。

亞馬遜發文力捧Rust,Go 技術負責人:别“拉踩”我們!

C 和 Rust 比其他語言更高效就不足為奇了,但令人驚訝的是差異的幅度。保守估計,廣泛采用 C 和 Rust 可以将計算能耗降低 50%。

那為什麼大家不更多地使用 C?它的語言和開發工具都非常成熟,社群規模也比 Rust 大得多。在 2021 年的開源峰會上,Linux 創造者 Linus Torvalds 坦言,用 C 語言實作代碼就像玩電鋸。作為一名終身寫 C 的程式員,Torvalds 知道,“(C 的微妙類型互動)并不總是合乎邏輯,對幾乎所有人來說都是陷阱。”

Torvalds 稱,Rust 是他見過的第一種可能解決問題的語言。Rust 提供了和 C 一樣的能效,同時還沒有未定義行為的風險。我們可以将能源消耗減半,同時不失去存儲安全的好處。

多項分析結果顯示,在 C/ C++ 中發生的高嚴重性 CVE 中,超過 70% 可以通過在 Rust 中實施相同的解決方案來預防。事實上,支援 Let's Encrypt 項目的非營利組織 Internet Security Research Group (ISRG) (一個 2.6 億個網站的證書頒發機構),目标是将所有網際網路安全敏感的基礎設施都遷移到記憶體安全的語言上,目前進行的項目包括在 Linux 核心中支援 Rust ,以及将 curl 遷移到 TLS 和 HTTP 的 Rust 實作。

我們再看看其他的研究結果。上圖中間一列顯示了執行時間的測試結果,Rust 和 C 的執行時間非常相似,這兩種語言的執行速度都比其他語言要快。這意味着,選擇 Rust 可以在獲得可持續性和安全性優勢的同時,還将擁有 C 的優化性能。

那麼,文章裡的這段論述出現了什麼問題呢?Cox 指出,“幾年前的有趣研究”是明顯存在的問題。該研究于 2017 年 10 月在 Intel i5-4460 CPU(2014 年第二季度)上使用 Go 1.6(2016 年 2 月)進行。“那已經是永遠的過去式了。”最重要的是,這個“真正有趣的研究”假設計算機語言基準遊戲是個可比較的程式來源,但了解這個網站的話就知道這完全不正确。

Cox 表示,最明顯的是,如果研究聲稱 C++ 的能源消耗比 C 使用多 34% 、執行時間快 56% 和記憶體多 14% ,那就需要重新檢查這個研究的前提假設了。“幾乎每個 C 程式都是有效的 C++ 程式,是以 C++ 不會輸,尤其是沒那麼糟糕!”

“是以,這個‘真正有趣的研究’并不是真正的有趣。事實上,我們應該以辯證的懷疑态度來看待。”Cox 寫道。

争議 2:不公平的對比

亞馬遜工程師在文章中還以聊天軟體 Discord 為例,講述從 Go 切換到 Rust 的過程。Cox 認為,其引用的 Discord 内容裡,關于從 Go 切換到 Rust 的部分存在令人難以置信的誤導。以下為文章中引起争議的第二個部分:

Discord 最初以 Python、Go 和 Elixir 為主,但他們的一項關鍵 Go 服務存在問題。這是一個非常簡單的服務,但還是導緻其尾部延遲嚴重。這是因為 Go 是一種垃圾回收 (GC) 語言,是以在建立和釋放對象時,垃圾回收器每隔一段時間就得停止程式的執行并運作一次垃圾回收。當 GC 運作時,程序無法響應請求,您可以看到 CPU 峰值和響應時間變化。

亞馬遜發文力捧Rust,Go 技術負責人:别“拉踩”我們!

左:Go,右:Rust

為解決該問題,Discord 決定嘗試用 Rust 重寫服務,上圖顯示的就是使用結果。雖然 GC 峰值模式在 Rust 中消失了,但真正驚人的差異在于變化的幅度。注意, Go 和 Rust 的計量機關是不同的。

Rust 版本速度總體上快了 10 倍以上,甚至最差的尾部延遲減少了 100 倍。這些都是令人難以置信的改進,同時由于伺服器響應效率變高,需要的伺服器變少,這意味着使用的能源也更少。雖然 Discord 還沒有決定開始用 Rust 來減少能源消耗,但這就是影響。

另外,Rust 并不是第一種高效的語言。C 已經存在了很長時間,但 Rust 是第一個在不犧牲安全性的情況下保證高效率的主流程式設計語言。用 C 和 C++ 編寫的所有高危安全漏洞中,70% 是記憶體不安全造成的。Rust 提供了效率,但不會讓人覺得自己在玩火。

對此,Cox 指出, Discord 的原帖中展示了一張 Go 伺服器和等效 Rust 伺服器的圖表。Rust 具有更可預測的性能,并避免了像 Go 中的延遲峰值,但它們的性能大緻相當。

亞馬遜發文力捧Rust,Go 技術負責人:别“拉踩”我們!

Discord 原帖中的對比圖,紫色線代表 Go,藍色線代表 Rust

相反,在亞馬遜的文章裡,在 Rust 和 Go 圖表标出了“ms”與“ s”的時間刻度對比。但該對比的前提是,Rust 伺服器進行了重大重寫,并使用了新的資料結構和更多記憶體。

“這要麼是完全沒有了解 Discord 的文章,要麼就是公然說謊。”Cox 認為,這種對比方法在誠實、公平的情況下是很好的表達方式,“但 AWS 的文章并非如此。”

不過,Cox 指出 Discord 的文章是公平的。“它将 Go 伺服器和 Rust 伺服器進行了對比,并在文章後面單獨繪制了 Rust 伺服器在使用重寫的資料結構和額外記憶體後的變化圖,而 AWS 的文章曲解了這一點。”

同時,Discord 的文章也提到了 Go 1.10,而 Go 1.18 也将很快釋出。這期間的 8 個版本有很多改進,減少了程式中有非常大的堆或非常多協定的 GC 暫停(Discord 伺服器兩者都有)。是以,使用最近的 Go 版本将顯着減少 Discord 延遲峰值。“但 Rust 仍然是适合該伺服器的優秀語言,團隊作出了合理的決定。”

Cox 沒有完全否認文章裡關于 Rust 的觀點,但在 Cox 看來,亞馬遜完全沒必要加上關于 Go 的誤導性陳述,“這看起來很丢人,Rust 足以獨立存在。”

Go、Rust 之争

兩種語言起源于同一時期。Go 于 2007 年構思并在 2009 年 11 月公開,Rust 出現在幾個月後的 2010 年,盡管 Graydon 暗示 Rust 的構思可能要早得多。

Go 和 Rust 還有很多共同點。兩者都是現代軟體語言,旨在為影響軟體開發的問題提供安全且可擴充的解決方案。兩者還都是針對當時現有語言遇到的問題而建立,特别是開發人員在生産力、可擴充性、安全性和并發性方面遇到的問題。是以,兩者常被認為是競争關系。

但兩者也有很多差異。谷歌 Go 程式設計語言的産品和戰略負責人 Steve Francia 認為,Go 和 Rust 在性能并發、可擴充性、開源意識等方面有着相似之處,但兩者有不同的權衡。Francia 在釋出到 thenewstack 的文章裡,詳細比較了 Go 和 Rust 的差異。

在性能方面,Go 具有開箱即用的出色性能。按照設計,Go 中沒有可以榨取更多性能的按鈕或操縱杆。Rust 旨在讓開發者能夠從代碼中榨取出每個性能,是以 Rust 有着更快的速度,代價是增加了複雜性。

在适應性方面,Go 快速疊代的優勢使開發人員能夠快速嘗試想法,并在解決手頭任務的工作代碼上進行磨練。這通常就已經足夠了,開發人員可以騰出時間做其他任務。另一方面,與 Go 相比,Rust 的編譯時間更長,導緻疊代時間更慢。這使得在更短周轉期内,Go 允許開發人員能在不斷變化的需求場景中工作得更好,Rust 則可以在擁有更多時間進行更精細、更高效開發的實作場景中發揮出色。

在易學性方面, Go 是更平易近人的語言,很多團隊甚至能夠在幾周内使用 Go 并将 Go 服務 / 應用程式投入生産。而由于其複雜性,Rust 被認為是一種難以學習的語言,但這也為 Rust 帶來了更高的性能。

在精确控制方面,Rust 擁有很大的優勢。Rust 可以使開發人員在如何管理記憶體、如何使用機器的可用資源、如何優化代碼以及如何制定解決方案等問題上,有更精準地控制。

是以,Francia 給出的建議是,Go 是大多數公司和開發者的正确預設選項,因為 Go 性能強大、易于采用,高度子產品化特性使其特别适用于需求不斷變化的情況。随着産品成熟和需求趨于穩定,企業可能有機會從邊際性能的提升中獲得巨大的收益。這些情況下,采用 Rust 來使性能最大化可能會是不錯的選擇。

結束語

“在我看來,與其閱讀那些将 Go 與 Rust 視為零和遊戲的文章,我更願意關注那些将 Go 和 Rust 視為互相補充、能很好協同工作的文章。”Cox 在最後說道。

程式設計語言之争從來沒有停過,每種語言都有大批的擁護者,甚至存在“鄙視鍊”的說法,每年的程式設計語言榜單也是大家競相關注的熱點。但程式設計語言之間并非水火不容,開發者需要學會選擇适合自己的語言。

相關資料:

https://aws.amazon.com/cn/blogs/opensource/sustainability-with-rust/

https://thenewstack.io/rust-vs-go-why-theyre-better-together/

https://twitter.com/_rsc/status/1496352332556161024

繼續閱讀