减少.wasm尺寸

对于 .wasm,是通过网络向客户端发送的二进制文件,如,我们的生命游戏的 Web 应用程序,我们希望密切关注代码大小。 我们的 .wasm 若是越小,我们的页面加载速度越快,用户体验就越好。

我们如何通过配置二进制构建减少 .wasm 文件的大小?

使用默认版本的构建配置(没有调试符号),我们的 WebAssembly 二进制文件是 29,410 字节:

  1. $ wc -c pkg/wasm_game_of_life_bg.wasm
  2. 29410 pkg/wasm_game_of_life_bg.wasm

启用 LTO 后,进行设置 opt-level = "z",并运行 wasm-opt -Oz, 结果的 .wasm 二进制文件缩小到,只有 17,317 字节:

  1. $ wc -c pkg/wasm_game_of_life_bg.wasm
  2. 17317 pkg/wasm_game_of_life_bg.wasm

如果我们用 gzip 压缩它(几乎每个 HTTP 服务器都会这样做)我们得到的是 9,045 字节!

  1. $ gzip -9 < pkg/wasm_game_of_life_bg.wasm | wc -c
  2. 9045

练习

  • 使用该 wasm-snip 工具从我们的游戏中的 .wasm 二进制文件,删除 panic! 基础设施函数,它节省了多少字节?
  • 建立我们的 游戏 crate,有没有 wee_alloc 作为其全局分配器。我们克隆的 rustwasm/wasm-pack-template 模板,有个 “wee_alloc”Cargo 特性,可以在 wasm-game-of-life/Cargo.toml 中的 [features] 部分添加,default 字段,启动该特性:

    1. [features]
    2. default = ["wee_alloc"]

    wee_alloc 去掉了 .wasm 二进制文件多少尺寸?

  • 我们只实例化了一个 Universe,因此,相较于提供一个构造函数,导出控制一个 static mut 全局实例的操作会更好。 如果这个全局实例也使用前面章节中讨论的双缓冲技术,我们也可以让这些缓冲区成为全局 static mut。 这将从我们的生命游戏实现中,删除所有的动态分配,还有我们做一个不包含分配器的 #![no_std] 箱子。我们完全删除分配器依赖后,又移除了 .wasm 的多少尺寸?