Open7
WebAssembly on Browser/node.js を実用まで持っていくための雑記
ピン留めされたアイテム
このスクラップのカバー範囲
- WebAssembly の有効な使い方のヒントとなる情報
このスクラップのカバーしない範囲
- WebAssembly の最適化
- WebAssembly のデバッグ方法
- WebAssembly のツールチェーンの紹介
- WebAssembly の最新 proposal
Web API では提供されない機能の実装
- JavaScript でも実装できるけれども、他言語から持ってきた方が素早く実装できるケース
- JavaScript で実装した方がパフォーマンスが出る可能性 vs JavaScript に書き換えるコスト
- WebAssembly の方がパフォーマンスが出る場合であれば WebAssembly を使う
- JavaScript/WebAssembly 間のデータ受け渡しコストが十分に小さいことが前提
- サーバ側で処理 & 結果をダウンロード という構成 vs ブラウザ側ですべて処理
- ファイルのダウンロード/アップロードの負荷 vs ライブラリダウンロードの大きさ
- クライアント側の CPU 負荷の許容範囲
- モバイル CPU 相手だと有効なケースは非常に限られそう
具体例
- ファイル圧縮/解凍
ライブラリ系列
- OpenCV.js
- FFMpeg.wasm
ゲーム制作系列
- DxLib HTML5 版
- OpenSiv3D for Web
WebAssembly でも JavaScript (Web API) でもできる処理
- WebAssembly vs Native (WebAssembly vs JavaScript ではない) となるため、パフォーマンスとコードサイズにおいて、WebAssembly に軍配が上がることはない
- WebAssembly で実装した方がいいケース
- 同一動作を保証しやすい (ブラウザ間/クロスプラットフォーム対応)
- 別の処理を WebAssembly で書いている
- JavaScript/WebAssembly 間のデータ受け渡しコストが大きいため、JavaScript か WebAssembly に統一する必要がある
- 重い部分だけ WebAssembly にするという方法は、データ受け渡しコストで帳消しされやすい
- JavaScript (Web API) で書くと非同期 + WebAssembly だと非同期と相性が悪い
- emscripten ASYNCIFY や Rust/C# の await/async でカバーできる
具体例
ほぼどのブラウザでも使える
- 画像読み込み/書き出し(Canvas)
- 文字レンダリング (ビットマップグリフの取得)
- 音声読み込み
- 暗号化/復号 (WebCrypto)
- Base64 へのエンコード/デコード
Chrome に限られる
- 文字レンダリング (ベクタグリフの取得)
- 音声エンコード
WebAssembly の方が遅い 記事リスト
WASMのパフォーマンス最適化の勘所と使い所考察
- 画像の RGBA 値を含む計算式の最大値を取得する
- ArrayBuffer への読み書き速度の問題?
- JavaScript で書いた処理 vs WebAssembly で書いた処理で、パフォーマンス & サイズにおいて JavaScript に軍配が上がった
- JavaScript/WebAssembly 間のデータの受け渡しコストはこの点において無関係
WebAssembly で画像のリサイズ処理をやってみたら JavaScript + Canvas API より遅かった話
- JavaScript/WebAssembly 間のデータの受け渡しコストが非常にボトルネックになる例
- CanvasRenderingContext2D.drawImage と cv::resize/cv::imshow では後者が数倍程度早い
NodeのRSA鍵生成・署名・検証について速度比較してみた
ありそうな WebAssembly に対する要求
- 既存の npm ライブラリを WebAssembly で再実装、依存関係を修正するだけでパフォーマンス UP できるくらいの便利よさ
- 既存の TypeScript プロジェクトをそのまま WebAssembly にビルドできてry)
- JavaScript 実装よりサイズが小さくなる
WebAssembly の方が速い 記事リスト
WebAssembly を動的生成した場合のパフォーマンスについて
- Brainf**k のインタプリタ, JavaScript/WebAssembly への JIT
- JavaScript/WebAssembly への JIT によって、JavaScript/WebAssembly のオプティマイザの恩恵を受けやすくなる?
- JavaScript への JIT の仕方が改善できる可能性 + 差が縮まる or 逆転の余地がある
- 単純に書き下したときに JavaScript より最適化の恩恵を受けやすいと見ることも