這份文件是與 Rust 和 WebAssembly 合作的**未發佈**文件,已發佈的文件可以在 Rust 和 WebAssembly 主要文件網站 找到。在此記載的功能可能無法在 Rust 和 WebAssembly 釋出的版本工具中使用。

縮小 .wasm 大小

例如,我們透過網路傳送給客戶端的 .wasm 二進制檔案(例如我們的 Game of Life 網頁應用程式),我們希望密切注意程式碼大小。我們的 .wasm 檔案越小,網頁載入的速度就越快,使用者也會越滿意。

我們可以透過建置設定將 Game of Life .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

練習

  • 使用 wasm-snip 工具 從 Game of Life 的 .wasm 二進制檔案中移除會引發恐慌的基礎架構功能。它可以節省多少位元組?

  • 使用和不使用 wee_alloc 作為其全域配置器來建立我們的生命遊戲板條箱。我們複製來啟動這個專案的 rustwasm/wasm-pack-template 範本有一個「wee_alloc」貨運功能,你可以透過將其新增至 wasm-game-of-life/Cargo.toml 中的 [features] 區段的 default 鍵來啟用它

    [features]
    default = ["wee_alloc"]
    

    使用 wee_alloc 可以為 .wasm 檔案縮減多少大小?

  • 我們永遠只會執行一個 Universe 實例化,因此與其提供一個建構函式,我們可以輸出用於操作一個 static mut 全域實例的運算。如果此全域實例也使用早期章節討論的雙重緩衝技巧,我們可以讓這些緩衝區也成為 static mut 全域變數。這個動作會從我們的生命遊戲實作中移除所有動態配置,而且我們可以讓它成為一個不包含配置器的 #![no-std] 板條箱。完全移除配置器相依性後,可以從 .wasm 中移除多少大小?