在写这篇文章之前,我已经花了几天看完了《Rust 程序设计语言》这本书,虽然不敢说已经熟悉或者精通 Rust,但对其语法和特性已有一个大概的认知。不过本文毕竟是一篇预研文,有些方面说的并不是很深入,同时有些问题可能需要真正用到生产环境中才会暴露。
注:本人是一个客户端 C++ 程序员,偶尔写 Java/Objc/Dart/Python,了解 Kotlin/Javascript/MATLAB。本文并不想引起编程语言的“圣战”,文中所提到的编程语言都有他们固有的不可取代的优势,因为文章重点原因可能并没有体现出来。
1. 语言
在使用 C/C++ 过程中,内存一直是程序员躲避不掉的坑,哪怕是一个经验再丰富的程序员,也会因为偶尔的开小差写出内存有问题的代码,而这种问题又恰恰是最难以排查的。
既然人都会犯错,那把内存管理交给计算机会怎么样呢?目前最流行的方式就是"垃圾回收机制": 在程序运行时不断地寻找不再使用的内存进行回收释放。这样做确实在很大程度上减轻了程序员的负担,但也由此带来了一定性能的损失,典型的编程语言:Java/C#/Go 都采用了这种方式。
而 Rust 则选择了另外一种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。在运行时,所有权系统的任何功能都不会减慢程序。当然也并不是全是好处,毕竟“命运赠送的礼物,早已暗中标好价码”。使用所有权系统的代价要先引入一套崭新的完整体系,这套体系导致学习曲线极其陡峭。但 Rust 依然选择了这条路,可以说 Rust 是一门"为了安全可以放弃一切"的编程语言。
2. 性能
使用不同的语言但是相同的算法实现在 90 秒内尽可能多的完成找出10000000以内的所有素数,主要测试了循环、动态数组、基本数学运算的性能。每种语言都会执行6次来减小误差。具体的代码在文末[参考3]
测试结果如下图:
可以看到性能上 C++ 依然称王称霸。Rust 紧随其后,相差也不大。
除了这个之外,还找到有别的网友使用了不同的语言来实现了一个 web 后台,通过 wrk 进行性能测试,详细描述在文末[参考4]。
测试结果如下:
3. 尺寸
只测试返回一个 "hello world" 的函数的情况下,用 Rust 编译成静态库使用,几乎对最终生成的产物 的体积没有影响,在 Android 上最终 so 是 5.9KB,在 iOS 上最终 app 文件是 188KB。
但是如果再使用 Rust 的其他函数或者宏,包体积会有个急剧增加的过程。例如在之前的基础上使用 panic!
,Android 的 so 文件会变成 977KB,iOS 的 app 文件会变成 5.2M。
理论上来讲,如果使用 Rust 的其他函数会涉及到 Rust 自有封装实现部分,所以随着开发者代码量的增加,会先出现急剧增加,然后慢慢趋向于平稳,折线表示变化过程: