🐕

WASMのサイズでかすぎね?: Rustが征く(6)

2021/09/22に公開

wasm-optを設定する

関連記事:

Rustが征くシリーズ過去記事

WebでWebAssemblyを使う方法を模索してふと思った。

(゚-゚) サイズでかいなぁ。。。

cargo buildで普通にビルドすると

wasm_image_resizer.wasm 2.2 MB

とメガ単位の結果がゴロゴロでてくる。
いくら光回線が当たり前のご時世でも、
ちょっとよろしくない。

なので今回はサイズを小さくする方法を調べてみる。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

最適化レベルの調整

コンパイル時に行う最適化を設定する
0, 1, 2, 3, s, zの6種類から選択。
最適化レベルが高いのはzだが、
zが一番容量小さくなるわけではないっぽい。
っていことでsを選択。

./Cargo.toml
[profile.release]
opt-level = 's'

コード生成を分割

コンパイル時に分割生成するユニット数を設定
コンパイル速度が変わってくるらしいが、
とりあえず最小の1を使用

./Cargo.toml
[profile.release]
codegen-units = 1

複数のクレート(依存も含む)をリンクするときに、
重複するコードを省いて容量を削減する・・・らしい。

設定は以下のものを追加するだけ。

./Cargo.toml
[profile.release]
lto = true

全部を踏まえて再度ビルドする

設定ファイルに上記内容を全部記述してビルド

./Cargo.toml
[profile.release]
lto = true
codegen-units = 1
opt-level = "z"
target size
original 2.2MB
optimize 749.5 KB

(・∀・) 1/3ぐらいになったか。

wasm-pack, wasm-bindgen-cliを使う

WebAssemblyを使う上で、
最早定番となっているwasm-pack, wasm-bindgenだが、
これらを使うことでサイズが小さくなる。
(仕組みはさっぱりわからない)
上記最適化設定を加えたままでビルドしてみる

cargo install wasm-pack
wasm-pack build --release
target size
original 2.2MB
optimize 749.5 KB
wasm-pack 160.0 KB

(・∀・)(・∀・) お、十分実用的になったか

wasm-stripを実行する

通常のビルドでは各種でバッグ情報をまとって生成されるので、
それらを剥がすことで容量を削減する。
Linux, Macなどには標準でstripと言うコマンドがあるが、
全環境対応を考えてwasm-stripを使う。

npm i -D wabt
npx wasm-strip --version
  1.0.23
npx wasm-strip ~~~.wasm
target size
original 2.2MB
optimize 749.5 KB
wasm-pack 160.0 KB
wasm-strip 159.9 KB

🤔 ・・・あんま変わらん?

何も考えず最適化オプションをつけておくのは重要かもしれないな。
wasmの用途はwasm-pack経由とは限らないので、
stripコマンドの使い方はwasm-packを使わないときにやるのが良いかもしれない。

Discussion