rust webassembly 优化参考资料

发布时间 2023-12-06 10:12:23作者: 荣锋亮

这几天在学习webassembly,尤其是cerbos lite 对于webassembly 的支持,所以简单整理一些

chatgpt给的一些建议

WebAssembly(Wasm)的优化涉及多个方面,包括编译器优化、代码结构调整、资源管理和压缩等。以下是一些通用的 WebAssembly 优化策略:

  1. 编译器优化:
    • 使用适当的编译器标志启用优化。在编译时,通常有不同的优化级别可供选择。
    • 使用针对 WebAssembly 的特定优化标志。例如,对于 Rust 编程语言,可以使用 --target wasm32-unknown-unknown -O 启用优化。
  2. 代码结构调整:
    • 将代码模块化,只导入和使用实际需要的功能。这有助于减小单个模块的大小,并且只有在需要时才加载额外的模块。
    • 使用代码拆分(code splitting)将大型应用程序分割为小块,以减小初始加载时的文件大小。
  3. 资源管理:
    • 确保没有不必要的资源或库打包到 WebAssembly 模块中。只包含项目需要的最小依赖。
    • 使用适当的数据结构和算法,以减小模块的内存占用。
  4. 压缩:
    • 使用专门的 WebAssembly 压缩工具,例如 wasm-opt,以减小文件大小。这些工具执行各种优化和压缩步骤。
    • 使用 gzip 或 Brotli 等通用压缩算法来减小传输过程中的文件大小。
  5. 避免不必要的复杂性:
    • 避免不必要的代码复杂性和深层嵌套,以减小模块的体积。清理和简化代码结构。
  6. 预编译:
    • 在部署之前,可以考虑将 WebAssembly 模块预编译为二进制格式,以提高加载速度。
  7. 缓存:
    • 利用浏览器缓存机制,确保 WebAssembly 模块和相关资源可以被缓存,从而减小每次加载的开销。
  8. 性能分析:
    • 使用性能分析工具,例如 Chrome DevTools 或其他浏览器开发者工具,来检查 WebAssembly 模块的性能瓶颈,从而有针对性地进行优化。

实际一些玩法

日常中基于rust 开发webassembly 的比较多,此时我们对于release 应该开启lto,同时可以使用一些工具比如wasm-opt,wasm-strip 之后对于文件大小的优化还是很不错的,目前在分析cerbos 的webassembly 生成的时候发现他们似乎没有使用一些主流的webassembly 框架(比如wasm_bingen,或者wasm-pack)似乎是直接基于wasm64-unknown-unknown 的target 构建生成的,只是包装了check 以及poliicy 文件(ci/cd 集成中处理的)
cargo.toml 参考配置,同时下边也有一些资料

 
[profile.release]
lto = true

参考资料

https://github.com/WebAssembly/binaryen
https://github.com/WebAssembly/wabt
https://doc.rust-lang.org/cargo/reference/profiles.html
https://rustwasm.github.io/docs/wasm-bindgen/reference/optimize-size.html
https://doc.rust-lang.org/rustc/platform-support/wasm64-unknown-unknown.html