尝试过Rust后,突然发觉Java不香了!幸好我是架构师

前言

我们在选择一种开发语言时会综合考量各方面的特性,根据实际的需求适当取舍。鱼和熊掌往往不可兼得,要想开发效率高,必然要牺牲性能和资源消耗,反之亦然。但是Rust却出其不意,令人眼前一亮!本文将从性能、内存安全、开发效率、跨平台性及生态等五个方面,对Rust这一编程语言进行一些科普性质的分享。

性能对比

不同的语言使用不同的内存管理方式,一些语言使用垃圾回收机制在运行时寻找不再被使用的内存并释放,典型的如Java、Golang。在另一些语言中,程序员必须亲自分配和释放内存,比如C/C++。Rust 则选择了第三种方式:内存被一个所有权系统管理,它拥有一系列的规则使编译器在编译时进行检查,任何所有权系统的功能都不会导致运行时开销。Rust 速度惊人且内存利用率极高,标准Rust性能与标准C++性能不相上下,某些场景下效率甚至高于C++。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务。网上已经有了很多关于Rust性能分析对比的文章,不过为了获得一手的资料,还是自己动手来的更加真实。我选择了Python,C++,Golang这3种语言来和Rust做性能对比。

性能测试场景设计

同样的算法用4种语言分别实现,对比在规定的时间内完成任务的次数。本次测试选择的算法是找出10000000以内的所有素数,比较在一分钟内完成找出所有素数任务的次数。

静态编译(或者打包)后生成的二进制大小对比

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

结论:(二进制大小)python > golang > rust > c++

运行速度对比

本场景下比较1分钟内找出1000000以内所有素数的次数。

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

结论:(运行效率)rust > c++ > golang > python

重点来了,在3台不同的机器上测试四次的结果显示:Rust效率居然高于C++!!!

内存消耗对比(粗略计算)

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

结论:(内存消耗) python > golang > rust > c++

CPU消耗对比(粗略计算)

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

结论:(CPU消耗)golang > python > rust = c++

以上便是我的测试结果,第一次测试后看到结果,有些吃惊,rust的性能居然超过了c++,不可思议,于是又在网上搜索,找到了别人已经完成的rust性能测试,网上的结果更让人吃惊!

我直接截图看结论:

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

以上为Rust vs Golang。

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

以上为Rust vs C++。

结论:以上截图显示,Rust在性能和资源消耗上不仅大幅度优于Golang,并且和C++性能不相上下,某些场景下效率甚至优于C++。

以上两种测试场景只是测试一些简单的算法,接下来我们看一下在实际使用中的性能资源占用对比,依然是在网上找到了一篇测试报告,该测试报告用Python、PyPy、Go、Rust四种语言实现了一个web后端,接下来使用wrk分别对四个http服务器进行压测,该测试场景比较贴近实际,直接截图看结论:

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

结论(性能):在实际作为后端服务使用的场景下,Rust比Golang依然有明显性能优势。

尝试过Rust后,突然发觉Java不香了!幸好我是架构师

结论(资源占用):在内存占用上Rust的优势更加明显,只用了Golang的1/3。

综合以上3个测试,Rust在运行效率和资源消耗上的优势十分明显,和C++同一个级别,远远优于Golang !

Rust开发效率问题

关于Rust开发效率问题,没有一个统一的客观评价标准,基本靠个人主观感觉而定。每个人对不同语言掌握的熟练度也是影响开发效率的重要因素。关于开发效率,谈一谈个人的感受:先说入门,由于Rust一些奇葩的语法的存在(最麻烦的莫过于生命周期标记),导致Rust入门不像Python和Golang等语言那样轻松,但是因为Rust主要是为了替代C/C++这类系统语言而存在,其借鉴了大量C++的语法,如果对C++熟悉,Rust入门不是难事;其次说说开发速度,对于初学者,Rust开发体验就像在上海开始实行的垃圾分类时上海人民的那种困惑和凌乱,编译器检查太严格了,大多数时间都是在解决编译问题,一种在其它语言中理所当然的写法,在Rust中就是不行,不过好在编译器的提示非常友好,根据编译错误提示大多数时候能够找到答案,不过编译虽然费事,可一旦编译通过,程序员就不需要关心内存安全,内存泄漏等头疼问题,只需要关注于业务逻辑,写了一个多月的Rust,debug次数屈指可数,而且每次debug都是因为业务逻辑,从来没有因为代码内存错误,崩溃等问题debug;如果对Rust稍微熟练一些,其开发速度绝对不会比Python和Golang慢,因为在编译阶段,Rust就解决了大部分的问题,省去了大量的debug时间。

跨平台性

Rust跨平台性和Golang一样,拥有优秀的跨平台性,支持交叉编译,一份代码可编译出支持windows、 linux、arm、macos、freebsd等平台上运行的二进制,且完全静态编译,运行时不依赖任何第三方库。这个特性对于饱受C++跨平台编译折磨的程序员来说简直是福音。Rust对嵌入式环境同样支持友好,有人用Rust写了一个简单的操作系统[6]。

生态问题

这一方面应该是Rust最弱的地方,作为一个后起之秀,其生态远远不如Python和Golang丰富,不过使用率很高的一些常用库都能找到;并且Rust连续3年成为Stack Overflow最受欢迎的语言[7],受到的关注度越来越高[8],相信未来Rust的社区一定会越来越丰富。

最后

本章讲解了Rust性能对比、开发效率、跨平台性和生态问题,唯独没有讲解内存安全的内容,为什么?

限于平台篇幅原因,关于内存安全性又太多,于是我放到了下一章,感兴趣的朋友可以持续关注,敬请期待!

猜你喜欢

转载自blog.csdn.net/GYHYCX/article/details/107569222
今日推荐