优化大小
当通过服务器提供一个 WASM 二进制文件时,文件越小,浏览器就能越快地下载它。更快的下载意味着更少的页面加载时间和更少的数据带宽使用,这意味着用户会更高兴。
本页给出了如何使你的 WASM 文件更小的一些建议。
不要过早地进行优化! 在开发过程中,你可能不需要小的 WASM 文件,而且这些优化技术中有许多会妨碍你的开发流程,给你造成更长编译时间、更少可调试性的代价。
根据你应用程序的性质,在合适的时间节点,建议对二进制大小和运行速度进行测量。
Twiggy 是一个用于 WASM 二进制文件的代码大小分析器,你可以用它来进行测量。
有关其他信息和更多技术,请参考 Rust and WebAssembly 书中有关缩小 .wasm
代码大小的章节。
大小第一,性能第二
你可以改变编译器的优化配置文件,告诉它优先考虑小的输出文件,而不是性能。
(虽然在一些罕见的情况下,对大小的优化实际上可以提高速度)
在 Cargo.toml
中,添加以下内容之一:
[profile.release]
opt-level = 's'
[profile.release]
opt-level = 'z'
这是两种不同的文件大小优化配置。通常情况下,z
比 s
产生更小的文件,但有时也可能是相反的。分别测量以确认哪一个对你更有效。
链接时优化 (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 中发布相关信息,以便将其添加到本页面中来!