官方:我们对Rust和WebAssembly的愿景
工作组愿景: 如外科手术般插入由Rust编译的wasm来加速JavaScript性能敏感的代码,而不需要扔掉或重写现有的代码库,也不需要更改现有的开发流程,做到无缝集成。
几点原因:
- 为什么关注性能敏感的代码? 因为js的优化并没有那么简单,而使用Rust你根本不需要成为js优化专家,不需要熟悉JIT内部实现,不需要魔法也能加速。
- 方便集成。直接编译为.wasm,使得现有的js代码库可以增量式部分采用Rust。而且还可以保持你现有代码库,不需要重写。
- 不需要更改你现有开发流程。对于js开发者,可以将.wasm发布到npm,然后在package.json中依赖它。可以导入为ECMAScript模块,遵循CommonJS风格的require,或者作为新的对象添加到JS全局。而对于Rust开发者来说,可以将.wasm发布到npm,甚至都不需要安装nmp、nodejs等js环境。wasm-pack会编译,优化并生成js绑定,然后发布到npm中。
当前状态和工具集:
- 正在写的书:The Rust and WebAssembly Book
- wasm-bindgen,帮助Rust和js通信。甚至通过它可以在js和rust之间发送string和struct这样的类型,而不仅仅是wasm标准里的整数和浮点数。
- wasm-pack,一站式构建、发布Rust编译的wasm。
- Twiggy ,检查.wasm代码尺寸的工具
- wee_alloc,为wasm设计的小型内存分配器
- wasm-snip,可以用一条unreachable指令强制替换函数的主体。用于在运行时永远不会使用的函数的情况。配合wasm-gc。
- console_error_panic_hook,将Rust内部编译错误在浏览器端显式,方便调试
当然,未来还需要更多的新伙伴加入Wasm工作组,共谋大业。
一个Rust开发的创意编码框架: Nannou
面向艺术家、黑客、设计人员、开发者,内置了很多简单、快速、方便可读的代码。
我学到了什么: 将Dateutil Parser 移植到Rust
Dateutil是python中用于处理日期时间的库。dateutil.parser具体来说,就是将人们想出的所有超级怪异时间格式转化为实际有用的时间格式。
经验:
-
转录代码时,不要试图用Rust来写python代码。
-
编写漂亮的代码不是首要的目的
-
不要迷信不懂Rust的人说的话。比如“听说Rust正在加入try-catch语法”,作者还以为是python中的try catch异常处理。
-
宏不是免费的。不要滥用宏,有可能增加编译时间,因为宏会产生冗余代码。
-
遇到了Rust生态问题,缺少一些需要的包。
twiggy 0.2 发布
Go vs Rust
任务: 计算20,000,000个数字中有多少个素数。
第一回合: 判断每一个数字是否为素数
- go:
- time 34.5s
- memory: 1490kb
- rust:
- time 31.9s
- memory: 550kb
Rust胜出。
第二回合: 进一步优化算法
- go:
- time 6.2 s
- memory: 结束内存占用29,000 KiB和45,000 KiB之间。
- rust:
- time 6.0s
- memory: 结束内存使用稳定在10,512 KiB
Rust胜出。
第三回合: 将数组换成切片
- go:
- time 6.0 s
- memory: 结束内存使用稳定在大约16,900 KiB
- rust:
- time 5.1s
- memory:结束内存使用稳定在10,516 KiB
Rust胜出。
所以,证明了Rust更好。
在Heroku上运行Rocket + Elm项目
Why Rust?
想在公司安利Rust的,可以看看这个视频。
区块链挖掘:尴尬的并行?
文章里用了三种不同的多线程并行方法,与单线程方案的性能进行比较
评论区
写评论还没有评论