优化大小

当通过服务器提供一个 WASM 二进制文件时,文件越小,浏览器就能越快地下载它。更快的下载意味着更少的页面加载时间和更少的数据带宽使用,这意味着用户会更高兴。

本页给出了如何使你的 WASM 文件更小的一些建议。

不要过早地进行优化! 在开发过程中,你可能不需要小的 WASM 文件,而且这些优化技术中有许多会妨碍你的开发流程,给你造成更长编译时间、更少可调试性的代价。

根据你应用程序的性质,在合适的时间节点,建议对二进制大小和运行速度进行测量。

Twiggy 是一个用于 WASM 二进制文件的代码大小分析器,你可以用它来进行测量。

有关其他信息和更多技术,请参考 Rust and WebAssembly 书中有关缩小 .wasm 代码大小的章节。

大小第一,性能第二

你可以改变编译器的优化配置文件,告诉它优先考虑小的输出文件,而不是性能。

(虽然在一些罕见的情况下,对大小的优化实际上可以提高速度)

Cargo.toml 中,添加以下内容之一:

[profile.release]
opt-level = 's'
[profile.release]
opt-level = 'z'

这是两种不同的文件大小优化配置。通常情况下,zs 产生更小的文件,但有时也可能是相反的。分别测量以确认哪一个对你更有效。

链接时优化 (LTO)

Cargo.toml 中,添加以下内容:

[profile.release]
lto = "thin"

LTO 告诉编译器将所有的代码放在一起优化,将所有的库视为一个整体。它可能能够更积极地内联和裁剪函数。

这通常会导致更小的尺寸和更好的性能,但需进行测量以便确认最终结果。有时,尺寸实际上可能会更大。

这样做的缺点是编译的时间会更长。请尽量只在为其它用户编译发行版本的时候这样做。

使用 wasm-opt 工具

binaryen 工具包是一套用于与 WASM 工作的额外工具。其中有一个工具是 wasm-opt,在优化方面它比编译器走得更远,可以用来进一步优化速度或大小:

# Optimize for size (s profile).
wasm-opt -Os -o output.wasm input.wasm

# Optimize for size (z profile).
wasm-opt -Oz -o output.wasm input.wasm

# Optimize aggressively for speed.
wasm-opt -O3 -o output.wasm input.wasm

# Optimize aggressively for both size and speed.
wasm-opt -O -ol 100 -s 100 -o output.wasm input.wasm

使用 wee-alloc 内存分配器

你可以用 wee-alloc 代替 Rust 的默认内存分配器,它的速度较慢,但其体积小于一千字节。

这可能会导致显著的性能冲击。如果使用它你的游戏仍然运行得足够快,那么较小的下载大小可能更重要。

Cargo.toml 中,添加以下内容:

[dependencies]
wee_alloc = "0.4"

然后在 main.rs 中,添加以下内容:


#![allow(unused)]
fn main() {
#[cfg(target_arch = "wasm32")]
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
}

你知道更多的 WASM 尺寸优化技术吗?请在 GitHub Issue 中发布相关信息,以便将其添加到本页面中来!