博客列表

用Rust为Node加速

单线程Node并不适合繁重的计算任务,即使有工作线程,使用Rust来提升Node性能依然是明智之选。

improving-node-js-performing-rust

为什么不是C++

  • 缺乏现代工具(合适的依赖管理器、羸弱的stdlib)
  • 内存不安全:比如for循环忘记退出,获得不属于应用的内存
  • C++已经很久了, 通常要动态链接库和共享代码机制对程序做扩展

Rust

  • 强类型 & 编译
  • 丰富的标准库:智能指针、容器、迭代器
  • Cargo生态繁荣
  • 编译时检查内存

WebAssembly

  • 便携二进制,由X86架构组装
  • 非原生,虚拟机执行
  • 多种语言编译而成,受主流浏览器支持
  • 可用AssemblyScript编写

对比

Node-Rust-WASM-compare

Rust增加60%性能,WASM增加45%,可见Rust比WASM快45%。像Java和C的对比一样,原生永远比虚拟机快,因为没有转换层。

选择

原生还是WASM

  • 原生模块可以调用标准库
  • 原生库可以被其它语言通过FFI调用,而JS不支持FFI
  • WASM没有标准库的权限,无法与文件系统、网络或操作系统交互,需要等WASI推进
  • WASM只能在虚拟机之间通用
  • WASM遇到自定义结构,需要做映射转换

开发者友好性

  • WASM-bindgen自动转换基本类型(i32, i64, f32, f64)
  • neon需要胶水层做Rust到JS的转换
  • 原生模块依赖宿主环境,像mac/win编译产物不互通,需要借助docker提高开发体验
  • 新手上手WASM更容易,C/C++/Rust都可以完美编译成WASM,Python/Ruby/Go部分支持

总结

通常我们在追求极致性能时,选用原生模块扩展Nodejs,当遇到业务中性能不佳的模块时,选择采用WASM。

Rust WASM
性能
复用 🤔 🤔
易用性
标准库
上手
浏览器环境 🤔 🤔