<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          何時使用 Rust 和何時使用 Go?

          共 884字,需瀏覽 2分鐘

           ·

          2021-10-08 21:24

          何時使用Rust和何時使用Golang

          隨著 Rust 的發(fā)展和一些 Gopher 關(guān)注 Rust,有人提出疑問:Rust 會侵蝕 Go 的市場?本文就一起看看,什么時候適合使用 Go,什么時候適合使用 Rust?


          一開始,Go 和 Rust 之間就有明顯的區(qū)別。Go 更加專注于構(gòu)建可擴展的 Web API 和微服務(wù),尤其是借助 Goroutines 的強大功能。后者對于 Rust 也是可能的,但是從開發(fā)人員的體驗來看,事情會相對比較難做。

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

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

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

          01 性能

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

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

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

          package?main

          import?(
          ????"fmt"
          ????"time"
          )

          func?f(from?string)?{
          ????for?i?:=?0;?i?3;?i++?{
          ????????fmt.Println(from,?":",?i)
          ????}
          }

          func?main()?{
          ????f("direct")

          ????go?f("goroutine")
          ????time.Sleep(time.Second)
          ????fmt.Println("done")
          }

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

          根據(jù)Bitbucket的防銹性能

          (來源:bechmarksgame[4]

          02 并發(fā)

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

          Goroutines 是 Go 內(nèi)置函數(shù)的一部分,而 Rust 僅接收本機 sync/wait 語法來支持并發(fā)。因此,在并發(fā)方面,Golang 的開發(fā)人員有體驗優(yōu)勢。但是,Rust 在保證內(nèi)存安全方面要好得多。

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

          use?std::thread;
          use?std::time::Duration;

          fn?main()?{
          ???//?1.?create?a?new?thread
          ???for?i?in?1..10?{
          ??????thread::spawn(||?{
          ?????????println!("thread:?number?{}!",?i);
          ?????????thread::sleep(Duration::from_millis(100));
          ??????});
          ???}

          ??println!("hi?from?the?main?thread!");
          }

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

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

          channel(通道)

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

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

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

          03 內(nèi)存安全

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

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

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

          04 開發(fā)人員體驗

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

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

          與 Go 相比,Rust 的學(xué)習(xí)曲線非常陡峭。值得一提的是,與 Python 和 JavaScript 等動態(tài)語言相比,Go 的學(xué)習(xí)曲線會陡峭些。

          05 何時使用 Go

          Go 在各種場景中都能很好地工作,使其成為 Web API 的很好選擇。正如Loris Cro[12]指出的那樣,“ Go 的并發(fā)模型非常適合必須處理多個獨立請求的服務(wù)器端應(yīng)用程序”。這正是 Go 提供 goroutines 的原因。

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

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

          在以下情況下選擇 Go:

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

          06 何時使用 Rust

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

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

          在以下情況下選擇 Rust:

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

          Go vs. Rust:真實想法

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

          但歸根結(jié)底,哪種語言更好?

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

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

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

          Go vs. Rust,你的選擇呢?

          作者:Michiel Mulders,原文鏈接:https://blog.logrocket.com/when-to-use-rust-and-when-to-use-golang/

          參考資料

          [1]

          該初學(xué)者指南: https://blog.logrocket.com/getting-up-to-speed-with-rust/

          [2]

          基準(zhǔn)測試: https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/rust-go.html

          [3]

          Bitbucket: https://bitbucket.org/blog/why-rust

          [4]

          bechmarksgame: https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/rust-go.html

          [5]

          可證明正確的并發(fā): https://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html

          [6]

          通道: https://doc.rust-lang.org/stable/rust-by-example/std_misc/channels.html

          [7]

          指針: https://doc.rust-lang.org/std/primitive.pointer.html

          [8]

          鎖: https://doc.rust-lang.org/std/sync/struct.Mutex.html

          [9]

          使用 Rust 進行無所畏懼的并發(fā): https://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html

          [10]

          類型安全: https://en.wikipedia.org/wiki/Type_safety

          [11]

          Bitbucket 博客: https://bitbucket.org/blog/why-rust

          [12]

          Loris Cro: https://kristoff.it/blog/why-go-and-not-rust/



          推薦閱讀


          福利

          我為大家整理了一份從入門到進階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進階看什么。關(guān)注公眾號 「polarisxu」,回復(fù)?ebook?獲取;還可以回復(fù)「進群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品自在拍在线拍 | 一级国产A片 | 成人视频网站在线观看18 | 国产精品白浆无码流出视频网站 | 亚洲天堂网中文字幕 |