【.NET番外篇】Rust環境搭建+基礎開發入門+Rust與.NET6、C++的基礎運算性能比較

前言:突然想打算把Rust作為將來自己主要的副編程語言。當然,主語言還是C#,畢竟.NET平臺這么強大,寫起來就是爽。緣起:之前打算一些新的產品或者新的要開發的東西,由于沒有歷史包袱,就想重新選型一下,在.NET平臺(C#語言)、Golang、Rust里面進行選擇一個。后面隨著多方面的對比,最終打算選擇Rust,理由是:臥槽,性能有點6!!!于是,就有了下面這個文章,自己搭建環境時候,以及后續的一些基礎的操作、性能比較,寫成了這個文章,供大家參考戲謔。

廢話不多說,直接開擼。以下均是在Windows環境下進行:

1、先安裝Rust環境。Rust環境下載地址:https://www.rust-lang.org/zh-CN/tools/install

然后根據自己的需要,選擇下載的版本。

9eae95421fbafdd5ef768a62799633ba.png

2、安裝期間,會提示操作選項,我這邊選擇的是默認 1.安裝完成以后,會有對應的提示。

dccc18ebab068190a4943c70e280396e.png

3、rustc --version可以查看rust環境的版本。

9ea0745e2aa716637dafba07ad57ba93.png

4、查看cargo工具版本。rust程序的編譯,離不開cargo。

da6b2f968951d1dd85648ca52c3d4132.png

5、如果需要對本地的rust環境進行升級,可以使用命令? rustip update(圖片標識錯了,大家看命令即可)

2b684fc6815a971507575c56b33725a0.png

6、使用命令 rustup doc可以調出教程文檔,不過都是英文的,英文好的大佬,用它來學習也是很不錯的選擇。

2a4daaab32eefc9ea8f31d48ca293d87.png

7、可以通過 cargo new 項目名稱 來創建一個新的項目。創建以后,會有一些初始的內容。

e4d1b22ca5819cb8b2497629d7d95fb3.png

8、cargo build會進行編譯,cargo run可以直接運行編譯后的程序。默認創建的是一個hello world,所以可以直接輸出。

dfd2ff21d18bda3cb44d2ae28269418e.png

9、編譯以后,在target文件夾內,會生成對應的可執行文件。cargo build默認是debug模式進行編譯。

12a731f0834d0aae3d9cc89cb2d417ef.png

10、我們也可以通過VS CODE來進行編輯代碼和編譯,效率高一點。

a8fe5fe5e3bc0faaf2c61ac548e6c83a.png

11、安裝Rust的拓展。目前沒這個拓展了,可以選擇 rust-analyzer,應該是原先Rust的更新版本。也有一百多萬的下載量了,看來玩的人有點多。

5bf9100a66091b9cdb413246d5c34acc.png

12、代碼debug工具,這個看個人,可以不安裝,沒啥影響。配圖可以不管。它只是提供了一個debug功能。

81f1e4e5001159c17c3b90ba3cc24cf6.png

13、VS CODE上面可以直接運行,運行時候默認會編譯到代碼文件同一個目錄下。控制臺也可以看到運行以后的輸出結果。

7ffb783a032296f91563c5564f7bcfb2.png

14、一些基礎語法說明,可以直接看下圖標識和說明。

da9f9f00df65e7d7c15305d87d5df4fa.png

15、Rust的變量比較神奇,默認的變量都是不可變的,如果需要允許可變,需要添加mut關鍵字來區分。

ee54c39526d9cd3bb1188fc5875f35d9.png

16、定義一個方法/函數以及其他基礎操作,可見下圖標識說明。

87fe516c4861c5e143a9364a5c6971f1.png

17、Rust的第三方包,都在 https://crates.io 上面。類似于,.NET開發上面,對應的Nuget包網址一樣。不過Cargo目前沒有VS這樣的強大編譯器集成了直接可視化查詢的東西,所以我們需要自己手動查找要的包以及版本。

18、例如我要用一個time包來做獲取時間的。我直接選個最新版本,0.3.15

c216f00790305190448ac09717a9fe40.png

然后在 cargo.toml里面,在dependencies里面添加該包的名稱和版本號。添加以后,會自動搜索有關版本進行下載引用。

f6bb9c1f83b13d3e67835a8b5bba3ad4.png

19、然后在代碼內進行引入。引入包,使用? extern crate 包名稱。例如time。use 類似C#里面的 using,可以using包內的一些功能或者模塊。例如我要獲取time里面的now()方法,不過這個包看來現在沒有這個方法了。

Rust這方面的語法和C++還是比較接近,通過 ::來進行引出下一級;類似.NET里面的 XXX.XXX的這個句點。

fd251d61ca0858530828b44a1f3adfdb.png

20、咱們換一個,換成 chrono這個包

2486c65567b8f921a9c23355bb483db4.png

21、然后引入有關版本進來,同上面的time操作。因為time包沒有我要的,所以就干掉就好了。

17725d771c3c98c09ef76226d1d4b381.png

22、引入包,以及使用它里面的所有功能模塊,可以使用*來代替,這點跟Java或Python比較類似。

68427247582c85e62f824544996a725a.png

23、然后寫一個累加器,用來做性能測試使用。例如,從1累加到10億。代碼可見下圖。

47f0153f7c7f1595faa4b5ed0d09d837.png

24、此處我再創建一個.NET 6都控制臺程序,也做同樣的事情,看看誰更快。有關代碼,如下圖所示,功能與Rust的代碼一模一樣。

69d6764a01e08e6ecdb682fa3ed4e5f6.png

25、為了更加公平,咱們把程序都編譯為release版本。使用命令 cargo build --release ?可以指定編譯為release版本

e0793562ddb40cb8cecb3e98f28f2db8.png

26、VS上對.NET 6開發的程序,也編譯成release版本。

0ced246784e77d1eb4f03bf7614cf2fa.png

27、為了方便查看效果,我們都在控制臺下面準備好這兩個程序。

9b9d570782e373a7fa6923171ff7a405.png

28、兩個程序都運行一下看看效果。可以發現各自的大概耗時。Rust大約耗費40~50MS,.NET6編寫的大約耗費600~700MS,臥槽,差距有點大。

12fa0ac94f7718a96e30c27ac22bcd3b.png

29、那再來個中間的語言,C++來看看效果。寫一個功能一模一樣的C++程序,也編譯為release版本,然后再看效果。由于C++版本輸出詳細時間,包括毫秒等,寫起來比較啰嗦,所以就簡單點,直接輸出耗時的毫秒數了。有關代碼以及說明,見下圖。

ead503f108c9e10c6d4ac7551c1d482a.png

30、C++的運行輸出結果,大約接近200MS,比.NET6快400MS,但是比Rust居然差距也這么多?unbelievable!

d693ed6e599c841dd9e9cea92d397290.png

31、為了客觀一點,咱再打開Rust與.NET6的程序,以及和C++程序,再運行一下看看結果。結果如下圖所示,還是差不多的保持上面的結果。

de09ca831e96ebdd4bee69437ead0646.png

32、總結一下:Rust依靠強大的性能,以及安全性(你寫代碼的時候就可以感受到了,如果被檢測到代碼不夠安全,波浪線或者錯誤提醒會一直提示你,直到你換個寫法),已經開始被更多的人采納。一些科普類的,就不繼續描述了,大佬們要是感興趣,可以自行去探索一下。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281723.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基本圖形的光柵化算法

如何在指定的輸出設備上根據坐標描述構造基本二維幾何圖形(點、直線、圓、橢圓、多邊形域、字符串及其相關屬性等)。 圖形生成的概念 圖形的生成:是在指定的輸出設備上,根據坐標描述構造二維幾何圖形。 圖形的掃描轉換&#xff1a…

php左側,php左側補零

在php中有兩個函數——至少有兩個是否有其他的我還不知道,能夠實現數字補零,str_pad(),sprintf()詳細如下str_pad顧名思義這個函數是針對字符串來說的這個可以對指定的字符串填補任何其它的字符串例如:str_pad(帶填補的字符串,填補后的長度,填…

python - work3

# -*- coding:utf-8 -*-project: jiaxyauthor: Jimmyfile: work_20181107.pyide: PyCharm Community Editiontime: 2018-11-07 10:46blog: https://www.cnblogs.com/gotesting/## 1:一個足球隊在尋找年齡在10歲到12歲的小女孩(包括10歲和12歲&#xff09…

團隊-中國象棋-最終程序

托管平臺地址:https://gitee.com/zhanghongjian666/ZhongGuoXiangQi 小組名稱:exciting 小組成員合照: 程序運行方法:html 程序運行示例及運行結果:轉載于:https://www.cnblogs.com/qwsa/p/7944093.html

NET CORE 基于緩存策略的SignalR控制推送頻率(每多少秒/多少次)API接口控制(限流)...

ASP.NET Core SignalR 概述,自行去官網搜。SignalR 沒有控制和前端推送頻率的功能,就是后端一旦發送請求,前端立馬響應。或者前端發送請求,后端立馬響應,但是如果誤操作,或者業務原因,對產生的信…

svn 的使用(二)

這篇主要介紹下 svn 鉤子的使用,svn 的安裝以及配置等能夠查看 svn 的使用(一) 我們能夠在svn創建的倉庫目錄下看到hooks 目錄。這里面就存放這個各種svn操作同一時候會運行的腳本文件。(你能夠自己查看每一個腳本文件&#xff0c…

java原子類場景,CAS你知道嗎?原子類AtomicInteger的ABA問題談談?,原子共面問題...

CAS你知道嗎?原子類AtomicInteger的ABA問題談談?,原子共面問題(1)CAS是什么?比較并交換舉例1, CAS產生場景代碼?importjava.util.concurrent.atomic.AtomicInteger;public classCASDemo {public static voidmain(Stri…

ABP Vnext 批量導入用戶,解決密碼加密問題

因為ABP Vnext在密碼加密方面使用的鹽加密的方式&#xff0c;底層的加密方式讓人摸不著頭腦。如何需要批量導入用戶的時候&#xff0c;這個密碼問題就很頭疼。假設&#xff0c;已經有一個集合List<entity>的用戶數據了&#xff0c;此時進行循環取出一條用戶信息&#xff…

深入分析JavaWeb Item7 -- HttpServletResponse詳解

Web服務器收到客戶端的http請求&#xff0c;會針對每一次請求&#xff0c;分別創建一個用于代表請求的request對象、和代表響應的response對象。request和response對象即然代表請求和響應&#xff0c;那我們要獲取客戶機提交過來的數據&#xff0c;只需要找request對象就行了。…

Spring.net學習記錄

Spring.Net功能&#xff1a; 1、控制反轉&#xff08;IOC&#xff09;&#xff1a;就是創建對象的權利由開發人員自己控制New&#xff0c;轉到了有容器來控制 2、依賴注入&#xff08;DI&#xff09;&#xff1a;就是通過容器來創建對象的時候&#xff0c;在對象初始化時給一些…

uAdmin the Golang Web framework

2019獨角獸企業重金招聘Python工程師標準>>> A little over two years ago, I started looking for a web framework like Django for Golang but to my surprise, I couldn’t find anything that even does the basic. My requirements were simple: A standard w…

ABP Vnext 數據庫表字段存在IsDeleted如何物理刪除HardDeleteAsync

ABP Vnext在寫表實體會繼承 xxxEntity : FullAuditedAggregateRoot<Guid>此時這個聚合根會包含一個 IsDeleted字段屬性&#xff0c;一旦繼承了這個軟刪除字段&#xff0c;你在倉儲對象調用 await _xxxxRepository.DeleteAsync(x > x.Id > 0)時的時候&#xff0c;…

詳解當當網的分布式作業框架elastic-job

詳解當當網的分布式作業框架elastic-job

java條件觸發,條件事件觸發Anylogic

所以首先event.restart()函數僅在事件具有觸發類型時才適用&#xff1a;timeout和mode&#xff1a;user control&#xff0c;否則你的event.restart()函數什么也不做......其次&#xff0c;你需要在有條件的事件上調用你的函數&#xff0c;但是在停車的那一刻......你可以在car…

攻城不易守城更難,匯付天下該如何守住打下來的“江山”?

伴隨著相關監管政策的實施&#xff0c;第三方支付市場儼然已經迎來了“罰單潮”。根據不完全統計&#xff0c;截至2018年10月8日&#xff0c;央行已開出109張支付罰單&#xff0c;國付寶等多家支付機構罰金甚至高達千萬以上&#xff0c;今年累計處罰的金額已超過2億元。照此速度…

1024技術論壇 | C#與.NET技術新發展

主辦方簡介上海維宏電子科技股份有限公司&#xff08;維宏股份&#xff0c;股票代碼&#xff1a;300508&#xff09;&#xff0c;是一家專業提供運動控制系統解決方案的高科技企業&#xff0c;公司擁有雄厚的研發力量和高素質的服務隊伍&#xff0c;我們以快捷的速度&#xff0…

Oracle Code登錄北京 代碼盛宴邀你high起來|免費報名

盛夏北京&#xff0c;將迎來 Oracle Code 北京站活動。作為貫穿全年、橫跨全球的 20 場活動中的一場&#xff0c;北京站汲取各地 Oracle Code 精華&#xff0c;結合國內開發者社區現狀和需求&#xff0c;呈現一場代碼盛宴。 來自 Oracle Code、OTN 及 AppsLap 的大咖們將齊聚北…

簡單的四則運算

// 20163536 楊宇航 獎勵原創 上課未完成原因&#xff1a; 哎&#xff0c;在上那節課時候&#xff0c;我們正在準備程序設計大賽&#xff0c;因為我們團隊當中只有我的電腦有數據庫&#xff0c;所有我只好將我的電腦貢獻給團隊了&#xff0c;不然在10分鐘內完成應該不成問題&a…

導出導入數據庫

一、導出用 mysqldump 備份數據庫 1mysqldump -u用戶 -p密碼 數據庫名 > &#xff08;目錄&#xff09;導出文件名如&#xff1a;mysqldump -uroot -p123 dbname > /root/test.sql 回車就直接完成備份。如果只需要建表指令&#xff0c;則命令如下&#xff1a; shell> …

matlab randn 范圍,請問randn產生的數據在什么范圍內變化

產生均值為0&#xff0c;方差 σ^2 1&#xff0c;標準差σ 1的正態分布的隨機數或矩陣的函數。Example:產生一個隨機分布的指定均值和方差的矩陣&#xff1a;將randn產生的結果乘以標準差&#xff0c;然后加上期望均值即可。例如&#xff0c;產生均值為0.6&#xff0c;方差為…