【.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.mzph.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;方差为…