Java,Go和Rust之間的比較 - Dexter

banq發表於2020-04-30

這是Java,Go和Rust之間的比較。這不是基準測試,而是關於:可執行檔案大小、記憶體使用、CPU使用率、執行時要求之間的比較,當然還有一個小的基準測試,可以每秒獲取一些請求。
測試三個Web服務的儲存庫託管在github上。直接看結論:

結論
在得出任何結論之前,我想指出這三種語言之間的關係(或缺乏)。Java和Go都是垃圾收集語言,但是Java會提前編譯為在JVM上執行的位元組碼。啟動Java應用程式時,將隨時隨地(JIT)編譯器呼叫,以透過將位元組碼編譯為原生程式碼來最佳化位元組碼,以提高應用程式的效能。
Go和Rust都提前編譯為原生程式碼,並且在執行時不會進行進一步的最佳化。
Java和Go都是垃圾收集語言,具有暫停應用導致類似世界末日的副作用。這意味著,每當垃圾收集器執行時,它將停止應用程式,進行垃圾收集,並在完成後從停止的地方恢復應用程式。大多數垃圾收集器需要停止執行,但是有些實現似乎不需要這樣做。
當Java語言在90年代建立時,其最大的賣點之一是一次編寫,可在任何地方執行。當時這非常好,因為市場上沒有很多虛擬化解決方案。如今,大多數CPU支援虛擬化,這種虛擬化僅在程式碼可以在任何地方(無論如何在任何受支援的平臺上執行)的前提下,才停止使用某種語言進行開發的誘惑。Docker和其他解決方案以便宜的價格提供虛擬化。
在整個測試中,應用程式的Java版本比Go或Rust對應版本消耗了更多的記憶體,在前兩個測試中,Java使用的記憶體大約增加了8000%。這意味著對於實際應用程式,Java應用程式的執行成本會更高。
對於前兩個測試,Go應用程式使用的CPU比Java少20%,同時處理38%的請求。另一方面,Rust版本使用的CPU比Go減少了57%,而處理的請求卻增加了13%。
第三次測試在設計上是佔用大量CPU的資源,因此我想從中擠出CPU的每一分。Go和Rust都比Java使用了1%的CPU。而且我認為,如果wrk不是在同一臺計算機上執行,​​那麼這三個版本都會使CPU的上限為100%。在記憶體方面,Java使用的記憶體比Go和Rust多2000%。Java可以處理的請求比Go多出20%,而Rust可以處理的請求比Java多出15%。
在撰寫本文時,Java程式語言已經存在了將近30年,這使得在市場上尋找Java開發人員變得相對容易。另一方面,Go和Rust都是相對較新的語言,因此與Java相比,自然而然的數量或更少的開發人員。不過,Go和Rust都獲得了很大的吸引力,許多開發人員正在將它們用於新專案,並且有許多使用Go和Rust的生產中正在執行的專案,因為簡單地說,就資源而言,它們比Java更有效。(也許是因為它們是街上的新酷語言!)
在編寫本文的程式時,我同時學習了Go和Rust。就我而言,Go的學習曲線很短,因為它是一種相對容易掌握的語言,並且與其他語言相比語法很小。我只用了幾天就用Go編寫了程式。關於Go需要注意的一件事是編譯速度,我不得不承認,與Java / C / C ++ / Rust等其他語言相比,它的速度非常快。該程式的Rust版本花了我大約一個星期的時間來完成,Rust具有嚴格的所有權規則,但是一旦掌握了Rust的所有權和借用概念,編譯器錯誤訊息就會突然變得更加有意義。違反借閱檢查規則時Rust編譯器對您大吼的原因,這是因為編譯器希望在編譯時證明已分配記憶體的壽命和所有權。這樣做可以保證程式的安全性(例如:沒有懸掛的指標,除非使用了不安全的程式碼轉義),並且在編譯時確定了釋放位置,從而消除了垃圾收集器的需求和執行時成本。當然,這是以學習Rust的所有權系統為代價的。
在競爭方面,我認為Go是Java(通常是JVM語言)的直接競爭對手,但不是Rust的競爭對手。另一方面,Rust是Java,Go,C和C ++的重要競爭對手。
Rust比Go具有根本優勢。它不是垃圾收集的語言,與C和C ++相比,它可以安全地編寫程式碼。例如,Go並不是特別適合用於編寫OS核心,而這裡又是Rust的亮點,並與C / C ++競爭,因為它們是使用OS編寫的長期存在和事實上的語言。Rust與C競爭的另一種方式/ C ++在嵌入式世界中。

相關文章