自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

何時使用 Rust 和何時使用 Golang?

開發(fā) 后端
Golang 和 Rust 之間有明顯的區(qū)別。Golang 更加注重構建可以無限擴展的 Web API 和小型服務,尤其是在 goroutine 的強大支持下。Rust 也可以用于小型服務,但是從開發(fā)人員的經(jīng)驗來看,事情要困難得多。

Golang 和 Rust 之間有明顯的區(qū)別。Golang 更加注重構建可以無限擴展的 Web API 和小型服務,尤其是在 goroutine 的強大支持下。Rust 也可以用于小型服務,但是從開發(fā)人員的經(jīng)驗來看,事情要困難得多。

Rust 非常適合處理大量數(shù)據(jù)和其他 CPU 密集型操作,例如執(zhí)行算法。這是 Rust 超過 Golang 的最大優(yōu)勢。要求高性能的項目通常更適合 Rust。

在本教程中,我們將就 Golang 和 Rust 進行比較和對比,評估這兩種編程語言的性能,并發(fā)性,內(nèi)存管理和整體開發(fā)人員體驗。我們還將概述這些元素,以幫助您一目了然地為項目選擇正確的語言。

如果您剛開始使用 Rust,那么在繼續(xù)閱讀之前,最好先閱讀一下初學者指南[1]。

如果您全都都準備好了,那就讓我們開始吧!

性能

Golang 最初是由 Google 的工程師設計的,于 2009 年向公眾推出。它的創(chuàng)建是為 C++提供替代方案,該替代方案易于學習和編碼,并且經(jīng)過優(yōu)化可在多核 CPU 上運行。

從那時起,Golang 對于希望利用該語言提供的并發(fā)性的開發(fā)人員來說非常有用。該語言提供了 goroutine,使您可以將函數(shù)作為 goroutine 運行。

Golang 的一大優(yōu)勢是您可以輕松使用 goroutines。只需將go添加到函數(shù)前即可使其作為 goroutine 運行。Golang 的并發(fā)模型允許您跨多個 CPU 內(nèi)核部署工作負載,從而使其成為一種非常有效的語言。

 

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "time" 
  6.  
  7. func f(from string) { 
  8.     for i := 0; i < 3; i++ { 
  9.         fmt.Println(from":", i) 
  10.     } 
  11.  
  12. func main() { 
  13.  
  14.     f("direct"
  15.  
  16.     go f("goroutine"
  17.     time.Sleep(time.Second
  18.     fmt.Println("done"

盡管有多核 CPU 支持,Rust 仍然跑贏 Golang。Rust 在執(zhí)行算法和資源密集型操作方面效率更高。該基準測試游戲[2]比較了 rust 和 golang 的不同算法,如二叉樹。對于所有經(jīng)過測試的算法,Rust 至少快 30%;在二叉樹計算的情況下,最高可達 1,000%。Bitbucket 的[3]一項研究表明,Rust 與 C++的性能相似。

 

何時使用 Rust 和何時使用 Golang?
(來源:基準測試游戲[4])

并發(fā)

如上所述,Golang 支持并發(fā)。例如,假設您正在運行一個處理 API 請求的 Web 服務器。您可以使用 Golang 的 goroutine 程序將每個請求作為 goroutine 運行,通過將任務分發(fā)到所有可用的 CPU 內(nèi)核來最大程度地提高效率。

Goroutines 是 Golang 內(nèi)置功能的一部分,而 Rust 僅支持本地 async/await 語法來支持并發(fā)。因此,在并發(fā)方面,Golang 的開發(fā)人員有經(jīng)驗優(yōu)勢。但是,Rust 在保證內(nèi)存安全方面要好得多。

這是 Rust 的簡化線程的示例:

 

  1. use std::thread; 
  2. use std::time::Duration; 
  3.  
  4. fn main() { 
  5.    // 1. create a new thread 
  6.    thread::spawn(|| { 
  7.       for i in 1..10 { 
  8.          println!("thread: number {}!", i); 
  9.          thread::sleep(Duration::from_millis(100)); 
  10.       } 
  11.    }); 
  12.  
  13.   println!("hi from the main thread!"); 

并發(fā)一直是開發(fā)人員的棘手問題。在不影響開發(fā)人員體驗的情況下保證內(nèi)存安全的并發(fā)性并不是一項容易的任務。但是,這種極端的安全重點導致創(chuàng)建了可證明正確的并發(fā)[5]。Rust 嘗試使用所有權概念來防止未經(jīng)請求的資源訪問,以防止出現(xiàn)內(nèi)存安全錯誤。

Rust 提供了四種不同的并發(fā)范例,以幫助您避免常見的內(nèi)存安全陷阱。我們將仔細研究兩個常見的范例:channel 和鎖。

Channel

channel[6] 有助于從一個線程傳送消息到另一個。雖然 Golang 也存在此概念,但 Rust 允許您將指針[7]從一個線程轉移到另一個線程,以避免爭用資源。通過傳遞指針,Rust 可以對 channel 強制執(zhí)行線程隔離。同樣,Rust 在并發(fā)模型方面表現(xiàn)出對內(nèi)存安全的癡迷。

僅當持有鎖[8]時才能訪問數(shù)據(jù)。Rust 依賴于鎖定數(shù)據(jù)而不是 cod 的原理,而 cod 經(jīng)常在諸如 Java 之類的編程語言中找到。

有關所有權和所有并發(fā)范例的更多詳細信息,請查看“使用 Rust 進行無所畏懼的并發(fā)[9]”。

內(nèi)存安全

較早的所有權概念是 Rust 的主要賣點之一。Rust 將類型安全[10]提升到了新的水平,這對于實現(xiàn)內(nèi)存安全的并發(fā)性也很重要。

根據(jù)Bitbucket 博客[11],“ Rust 非常嚴格和繁瑣的編譯器會檢查您使用的每個變量以及您引用的每個內(nèi)存地址。它避免了可能發(fā)生的數(shù)據(jù)爭用情況,并通知您未定義的行為。”

這意味著由于 Rust 對內(nèi)存安全性的極度癡迷,您最終不會出現(xiàn)緩沖區(qū)溢出或爭用情況。但是,這也有其缺點。例如,您在編寫代碼時必須非常了解內(nèi)存分配原則。始終保持您的內(nèi)存安全防護并不容易。

開發(fā)人員體驗

首先,讓我們看一下每種語言的學習曲線。Golang 在設計時考慮了簡單性。開發(fā)人員經(jīng)常將其稱為“無聊”語言,也就是說,其有限的內(nèi)置功能集使 Golang 易于學習、使用。

此外,Golang 提供了比 C++更簡單的替代方案,隱藏了諸如內(nèi)存安全性和內(nèi)存分配等方面的內(nèi)容。Rust 采用了另一種方法,迫使您考慮諸如內(nèi)存安全性的概念。所有權的概念和傳遞指針的能力使 Rust 失去了學習的吸引力。當您不斷考慮內(nèi)存安全性時,您的工作效率就會降低,并且您的代碼注定會變得更加復雜。

與 Golang 相比,Rust 的學習曲線非常陡峭。值得一提的是,與 Python 和 JavaScript 等動態(tài)語言相比,Golang 的學習曲線較為陡峭。

何時使用 Golang

Go 在各種用例中都能很好地工作,使其成為創(chuàng)建 Web API 的 Node.js 的絕佳替代品。正如Loris Cro[12]指出的那樣,“ Go 的并發(fā)模型非常適合必須處理多個獨立請求的服務器端應用程序”。這正是 Golang 提供 goroutines 的原因。

此外,Golang 內(nèi)置了對 HTTP Web 協(xié)議的支持。您可以使用內(nèi)置的 HTTP 支持快速設計一個小型 API,并將其作為微服務運行。因此,Golang 非常適合微服務架構并滿足 API 開發(fā)人員的需求。

簡而言之,如果您重視開發(fā)速度并且更喜歡語法簡單而不是性能,那么 Golang 是一個很好的選擇。最重要的是,Golang 提供了更好的代碼可讀性,這對于大型開發(fā)團隊而言是一個重要標準。

在以下情況下選擇 Golang:

  • 您關心簡單性和可讀性
  • 您需要一種簡單的語法來快速編寫代碼
  • 您想使用支持 Web 開發(fā)的更靈活的語言

何時使用 Rust

當性能很重要時,例如在處理大量數(shù)據(jù)時,Rust 是一個不錯的選擇。此外,Rust 為您提供了對線程行為以及線程之間資源共享方式的細粒度控制。

另一方面,Rust 具有陡峭的學習曲線,并且由于內(nèi)存安全性的額外復雜性而減慢了開發(fā)速度。這并不一定是不利的。Rust 還保證當編譯器檢查每個數(shù)據(jù)指針時,您不會遇到內(nèi)存安全性錯誤。對于復雜的系統(tǒng),此保證會派上用場。

在以下情況下選擇 Rust:

  • 您關心性能
  • 您想要對線程進行細粒度的控制
  • 您重視內(nèi)存安全而不是簡單性

Go vs. Rust:我的大實話

讓我們從突出相似之處開始。Go 和 Rust 都是開源的,旨在支持微服務架構和并行計算環(huán)境。兩者都通過并發(fā)優(yōu)化了可用 CPU 內(nèi)核的利用率。

但歸根結底,哪種語言是最好的?

有很多方法可以解決這個問題。我建議考慮要構建哪種類型的應用程序。Golang 可很好地用于創(chuàng)建 Web 應用程序和 API,這些應用程序和 API 利用其內(nèi)置的并發(fā)功能,同時支持微服務體系結構。

您還可以使用 Rust 來開發(fā) Web API,但并不是在設計時考慮到此用例。Rust 對內(nèi)存安全性的關注增加了復雜性和開發(fā)時間,尤其是對于相當簡單的 Web API。但是,對代碼的大量控制使您可以編寫更優(yōu)化,內(nèi)存效率更高且性能更高的代碼。

簡而言之,Golang 與 Rust 的爭論實際上是一個簡單與安全的問題。

有關更多觀點,請查看“在 Go 和 Rust 之間選擇[13]”。

LogRocket:全面了解線上 Rust 應用程序

調(diào)試 Rust 應用程序可能很困難,尤其是當用戶遇到難以重現(xiàn)的問題時。如果您對監(jiān)控和跟蹤 Rust 應用程序的性能,自動顯示錯誤以及跟蹤緩慢的網(wǎng)絡請求和加載時間感興趣,請嘗試 LogRocket[14]。

 

何時使用 Rust 和何時使用 Golang?

LogRocket[15]就像 Web 應用程序的 DVR,實際上記錄了 Rust 應用程序中發(fā)生的所有事情。您可以匯總并報告問題發(fā)生時應用程序所處的狀態(tài),而不用猜測為什么會發(fā)生問題。LogRocket 還監(jiān)視您的應用程序的性能,報告諸如客戶端 CPU 負載,客戶端內(nèi)存使用情況等指標。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2021-11-26 09:00:00

數(shù)據(jù)庫數(shù)據(jù)集工具

2021-04-12 07:34:03

Java集合框架

2011-08-08 15:43:01

MySQL索引

2012-02-08 11:01:53

HibernateJava

2019-11-29 07:53:07

DNSTCP網(wǎng)絡協(xié)議

2024-04-16 12:00:14

API系統(tǒng)

2021-12-09 09:52:36

云原生安全工具云安全

2020-12-13 14:32:22

5GWi-Fi 6

2020-10-10 10:20:11

云計算云安全技術

2013-08-21 15:06:31

iOSself.

2024-08-01 10:10:24

MySQL場景搜索

2019-06-18 07:56:32

5GWi-Fi 6網(wǎng)絡

2021-04-25 15:06:16

微軟虛擬桌面IT

2021-06-01 11:11:26

物聯(lián)網(wǎng)互聯(lián)網(wǎng)IoT

2019-12-06 09:41:40

開源技術 軟件

2024-10-07 08:49:25

2018-12-12 09:59:47

微服務架構分布式系統(tǒng)

2020-02-25 16:00:28

JavaScript數(shù)據(jù)技術

2023-11-10 12:55:00

消息代理事件代理

2021-04-14 07:52:00

Vue 作用域插槽
點贊
收藏

51CTO技術棧公眾號