C++和Rust_连续 3 年最受欢迎:Rust,香!

  • Post author:
  • Post category:其他


097313d845bc1a21107f2a8c4d4325aa.png


简介:

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

1fb52bc20c75be7ae50279c5a40433ef.png

一 性能对比

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

性能测试场景设计

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

源代码链接见[1]。

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

b63b284c3ee2817888eefefcf2c43aef.png

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

运行速度对比

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

e46e46e34e94fa8ea67ac7866b2224d3.png

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

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

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

4d55926930f95ce905392d056a1f332a.png

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

CPU消耗对比(粗略计算)

4e2a88c329b6d20036aa6d02be954bb0.png

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

以上便是我的测试结果,测试代码、二进制和测试结果参考附件bin.zip,第一次测试后看到结果,有些吃惊,rust的性能居然超过了c++,不可思议,于是又在网上搜索,找到了别人已经完成的rust性能测试,网上的结果更让人吃惊,先看第一篇,原始链接见[2]。

我直接截图看结论:

713d1c52770e18884d99440367864bb8.png

a7879f7df9d2a386e08c3ee6b30ed4d9.png

以上为Rust vs Golang。

ef44eb56ef7b4f8dc7c601c888f061da.png

0e15cede2473c09de9f701c57fe5bab1.png

以上为Rust vs C++。

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

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

4917be207f9c30b0fb99ee239a8d4521.png

618e1723a94ce56daa6370eab75e1c74.png

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

b2a8b2dedc845b0ef7bea2dc0d8d5556.png

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

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

二 内存安全性

Rust 最重要的特点就是可以提供内存安全保证,而且没有额外的性能损失。在传统的系统级编程语言( C/C++) 的开发过程中,经常出现因各种内存错误引起的崩溃或bug ,比如空指针、野指针、内存泄漏、内存越界、段错误、数据竞争、迭代器失效等,血泪斑斑,数不胜数;内存问题是影响程序稳定性和安全性的重大隐患,并且是影响开发效率的重大因素;根据google和微软 两大巨头的说法,旗下重要产品程序安全问题70%由内存问题引发[4], 并且两个巨头都用利用Rust语言来解决内存安全问题的想法。Rust语言从设计之初就把解决内存安全作为一个重要目标,通过一系列手段保证内存安全,让不安全的潜在风险在编译阶段就暴露出来。接下来根据自己粗浅的理解,简单介绍Rust解决内存安全的手段有哪些。

1 所有权规则