Open6
WebAssembly のビルド時最適化にまつわる雑記
ピン留めされたアイテム
このスクラップがカバーする範囲
- 各ツールがどのように WebAssembly を最適化するか
- WebAssembly の最適化に使えそうな手法の紹介
このスクラップがカバーしない範囲
- WebAssembly の最適化ツールの使い方
Clang のリンク時最適化
この分野に疎いのでマサカリ飛んできそう
LLVM Link Time Optimization: Design and Implementation
- コンパイル時評価
- 定数への置き換え
- DCE (Dead Code Elimination)
- 使うことのないコードパスの削除
- 呼ばれない関数の削除
DCE の限界
- 呼ばれることのない関数/データをすべて削除して、全ての関数/データが実行時に使われるようにできるのが理想
- JavaScript などから import された関数の呼び出しは、それが無駄なものだったとしても原則削除できないはず
- DCE に影響しそう?
- JavaScript 系のツールは WebAssembly の最適化を知らなさそう
Similar Function Elimination
merge-similar-functions size optimization pass, which merges similar functions
- binaryen の最適化パスのうちの一つ
- 似た関数同士をまとめて一つの関数にし、コードサイズの縮小を目指す
- ビルド時にインライン化の抑制をかけて、ビルド後にこの最適化をかけたらよさそう?
emscripten side modules
- emscripten を使えばダイナミックリンクができる
- 必要に応じてコードを追加でダウンロードすることで、ダウンロードした WebAssembly バイナリに含まれる関数/データがすべて使われるようにできそう
- Asyncify と組み合わせれば、dlopen 時に WebAssembly バイナリをダウンロードというのも可能
データセクションの最適化
- 非 0 な部分だけをデータセクションに格納するようにする
- 線形メモリが 0 初期化されている + データセクションは分割可能
- Clang の最適化オプションで勝手にやってくれる
- データの再配置が必要な場合はこの最適化が使えない
- 例. emscripten side modules