WASMのサイズでかすぎね?: Rustが征く(6)
wasm-optを設定する
関連記事:
Rustが征くシリーズ過去記事
WebでWebAssemblyを使う方法を模索してふと思った。
(゚-゚) サイズでかいなぁ。。。
cargo buildで普通にビルドすると
wasm_image_resizer.wasm 2.2 MB
とメガ単位の結果がゴロゴロでてくる。
いくら光回線が当たり前のご時世でも、
ちょっとよろしくない。
なので今回はサイズを小さくする方法を調べてみる。
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪
------------------- ↓ 本題はここから ↓-------------------
最適化レベルの調整
コンパイル時に行う最適化を設定する
0, 1, 2, 3, s, zの6種類から選択。
最適化レベルが高いのはzだが、
zが一番容量小さくなるわけではないっぽい。
っていことでsを選択。
[profile.release]
opt-level = 's'
コード生成を分割
コンパイル時に分割生成するユニット数を設定
コンパイル速度が変わってくるらしいが、
とりあえず最小の1を使用
[profile.release]
codegen-units = 1
Link Time Optimazation
複数のクレート(依存も含む)をリンクするときに、
重複するコードを省いて容量を削減する・・・らしい。
設定は以下のものを追加するだけ。
[profile.release]
lto = true
全部を踏まえて再度ビルドする
設定ファイルに上記内容を全部記述してビルド
[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