Golang vs Rust 效能之間的較量(1)

語言: CN / TW / HK

C T O

   

   

 

Go Rust Python Istio containerd CoreDNS Envoy etcd Fluentd Harbor Helm Jaeger Kubernetes Open Policy Agent Prometheus Rook TiKV TUF Vitess Argo Buildpacks CloudEvents CNI Contour Cortex CRI-O Falco Flux gRPC KubeEdge Linkerd NATS Notary OpenTracing Operator Framework SPIFFE SPIRE     Thanos

Golang vs Rust 效能之間的較量(1)

Rust Golang 是目前編譯語言的兩大亮點。這兩種語言都承諾為程式提供低延遲和出色的記憶體管理。雖然大約 86.69% 的開發人員選擇 Rust 作為他們最“喜愛的語言”,但 Golang 也不甘落後,它是世界上第三大最受歡迎的語言,並被 Dropbox Twitch Netflix Uber 等多家世界知名公司使用。

Gopher Vs Ferris crab

Gopher Go 的吉祥物,而摩天蟹是 Rust 的吉祥物。

為了比較這兩種語言的效能到底誰更有優勢,下面將所有用於測試的處理器使用的都將用的是 i7 核心,主頻為 2.6GHz ,記憶體為 16GB 。我還分享了用於基準測試的程式碼片段。儘管我已盡力保持兩個程式的流程相同以獲得最大的可比性,但請隨時指出您可能發現的任何異常情況。

執行次數

我決定比較這兩種語言將 100 萬個整數( 64 位)[最初按降序排序] 到升序所需的執行時間。我決定使用選擇排序,因為它涉及大量迭代。時間複雜度顯然是 O(n²) ,這意味著我們的程式碼將大約處理 10¹² 次迭代!

                      GO排序
                       Rust排序

結果

給定的圖表描述了對具有 100 萬個元素的陣列進行選擇排序時對前 n 個元素進行排序所需的時間。 n 顯示在 x 軸上,執行時間(以秒為單位)顯示在 y 軸上。

  • Go 記錄的峰值記憶體: 9600KB

  • Rust 記錄的峰值記憶體: 8116KB

結論

Rust 是明顯的贏家,無論是在記憶體還是執行時間方面。

動態記憶體分配

動態記憶體分配是程式執行過程中經常發生的事情。雖然 Go 有一個高度優化的垃圾收集器,可以掃描記憶體中未引用的部分並刪除它們,但 Rust 沒有專門的垃圾收集器。相反, Rust 的規則和語義(使用移動和所有權的概念)使得分配的記憶體的生命週期是確定的,因此垃圾收集是確定的。對於這個測試,我動態分配了一個大小為 100 萬的 64 int 向量 10 萬次。對於每次這樣的迭代,我確保前一次迭代分配的記憶體是未引用的,因此適合垃圾收集。

                      Go
                      Rust

結果

  • Rust :所需的總時間: 16.0244 秒
  • Golang :所需的總時間: 39.7851 秒,其中 Go 垃圾收集器將垃圾收集程式暫停了 2.7714 秒。呼叫垃圾收集的次數(使用預設配置)為 99872

結論

顯然, Rust 再次成為明顯的贏家。 Golang 中的 GC 暫停佔我們程式執行時間的約 7%

下一步是什麼?

雖然很明顯 Rust 似乎在 Golang 方面明顯更好,但我們還不應該形成判斷。因為 Golang 的主要優勢之一是使用 Go 例程的併發性。雖然這裡提到的所有測試都是單執行緒的,但大多數企業應用程式通常涉及多執行緒。因此,在下一章中,我將比較用這兩種語言編寫的多執行緒程式。敬請關注!

感謝您閱讀這篇文章。希望你學到了新東西。快樂編碼!

參考地址 [1]

參考資料

[1]

參考地址: https://medium.com/@bhvsaraf536/clash-of-the-compiled-golang-vs-rust-62595cb90377