縮小 .wasm 大小

對於我們透過網路傳送給客戶端的 .wasm 執行檔,例如生命遊戲網路應用程式,我們必須注意程式碼大小。.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

練習

  • 使用 wasm-snip 工具 從我們生命遊戲的 .wasm 執行檔中移除會引發錯誤的基底架構函式。它可以節省多少位元組?

  • 使用 wee_alloc 作為全局分配器,或不使用它來建構我們的「生命遊戲」crate。我們複製用於開啟此專案的 rustwasm/wasm-pack-template 範本具有「wee_alloc」Cargo 功能,你可以透過將它新增到 wasm-game-of-life/Cargo.toml[features] 區段的 default 鍵來啟用它。

    [features]
    default = ["wee_alloc"]
    

    使用 wee_alloc 可以減少多少 .wasm 二進位檔案的大小?

  • 我們只會實例化一個 Universe,因此,我們可以匯出一些操作來操作一個 static mut 全域實例,而不是提供一個建構函數。如果這個全域實例也使用前面章節討論的雙緩衝技術,我們可以讓這些緩衝區也成為 static mut 全域變數。這從我們的「生命遊戲」實作中移除了所有的動態配置,而且我們可以讓它成為一個 #![no_std] Crate,其中不包含分配器。透過完全移除分配器相依性,我們可以移除多少 .wasm 大小?