Java,Go和Rust之間的比較 - Dexter
這是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 ++在嵌入式世界中。
相關文章
- Rust, Go與Hasekll比較 - RedditRustGo
- 類和類之間的比較
- Java、Rust、Go、NodeJS、TypeScript併發程式設計比較 - foojayJavaRustGoNodeJSTypeScript程式設計
- Go和Python比較的話,哪個比較好?GoPython
- Go 與 C++ 的對比和比較GoC++
- Python、JavaScript和Rust的Web效能比較 - AlexPythonJavaScriptRustWeb
- Java和JavaSciprt比較Java
- Windows、Linux 和 Mac:作業系統之間的比較WindowsLinuxMac作業系統
- Rust與Go在區塊鏈中的應用比較 - definoobsRustGo區塊鏈
- 2024 年 Go 與 Rust 的較量GoRust
- 使用Go的Defer和Rust的Drop實現資料庫事務機制的比較 - DEVGoRust資料庫dev
- Go中泛型和反射比較指南Go泛型反射
- Java™ 教程(比較字串和字串的部分)Java字串
- Dalvik 和 Java 位元組碼的比較Java
- Java 中 Comparable 和 Comparator 比較Java
- go-carbon 1.2.2 版本釋出了,新增時間設定和時間差比較功能Go
- PostgreSQL與Rust的聚合實現比較SQLRust
- Boost.Asio和ACE之間關於Socket程式設計的比較程式設計
- Rust的Vector vs. Golang的Slice比較RustGolang
- ABAP SICF服務和Java Servlet的比較JavaServlet
- SAP ABAP ADBC和Java JDBC的使用比較JavaJDBC
- 從JS和Rust的析構比較中發現Rust哲學:顯性化 - PaulJSRust
- Java的位元組碼和ABAP load的比較Java
- C++與Rust變數宣告的比較C++Rust變數
- Go與C#的比較 - RedditGoC#
- Java的BigDecimal比較大小JavaDecimal
- js 深比較和淺比較JS
- Java 比較器Java
- JAVA中字串比較equals()和equalsIgnoreCase()的區別Java字串
- JAVA中的Comparable介面和自定義比較器Java
- Java中的字串操作(比較String,StringBuiler和StringBuffer)Java字串UI
- C++與Rust操作裸指標的比較C++Rust指標
- C++與Rust引用外部符號的比較C++Rust符號
- go-carbon 1.2.4 版本釋出,新增系列時間比較方法Go
- 在java中進行日期時間比較的4種方法Java
- Java動態代理 jdk和cglib的實現比較JavaJDKCGLib
- ==和equals方法的比較
- ImageMagic 和 GraphicsMagick 的比較