commit/ca122c2cfcd50dc529b19d5e58542ddf12670a61

缩减.wasm大小

对于.wasm通过网络传递给客户端的二进制文件,例如我们的Web生命游戏应用,我们想要随时留意代码大小。 我们的.wasm越小,页面加载的也就越快,用于也就越开心。

通过构建配置文件,我们的生命游戏.wasm二进制文件能有多小?

花店时间阅读一下我们可以调整的构建配置选项使我们得到更小的.wasm

使用默认的发布构建配置(不带调试符号),我们的WebAssembly二进制文件是29,410字节:

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

在启用LTO,设置opt-level = "z",并运行wasm-opt -Oz之后,.wasm二进制文件缩减到了17,317字节:

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

如果我们使用gzip(这几乎是每个HTTP服务都会做的)我们降到了9,045字节!

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

Exercises

  • 使用wasm-snip工具 从我们的生命游戏的.wasm二进制文件中移除基础错误函数。这节省了多少字节?

  • 使用和不适用wee_alloc作为全局分配器 分别构建我们的生命游戏包。 我们克隆以开始这个项目的模板rustwasm/wasm-pack-template有一个 叫"wee_alloc"的cargo特性,使你可以通过将它添加到default键来启用它, 这个键位于wasm-game-of-life/Cargo.toml文件的[features]部分。

    [features]
    default = ["wee_alloc"]
    

    使用wee_alloc减少了.wasm多少大小?

  • 我们只初始化只初始化一个Universe,所以与其提供一个构造器, 不如我们可以导出一个操作,它持有单个static mut的全局实例。 这个全局实力也使用前面章节讨论过的双缓冲技术,我们可以使那些缓冲区也是全局static mut的。 这从我们的生命游戏实现中移除了所有的动态分配,使得我们可以让它成为一个不需要包含分配器的#![no_std]库。 完全移除分配器依赖后.wasm减少了多少大小?

results matching ""

    No results matching ""