注目★★★★★Lobsters
Rust を WebAssembly にコンパイルするとなぜ遅いのか——デバッグ情報処理の非効率
30秒で把握
- 1Rust → WebAssembly コンパイルで debug = 2 時に 50 秒超え、原因は DBG_VALUE レコード走査の二次計算量
- 227 万個のデバッグレコードと Register Stackify の非効率な線形走査の組み合わせで時間劣化、ライブラリでは 40 倍遅化事例
- 3上下スキャンとハッシュ検索削減パッチでハッシュテーブル検索 27.4M→3.0M、すべてのターゲットで改善可能
要約
Rust を WebAssembly にコンパイルする際、デバッグ情報 (debug = 2) を有効にすると大幅に遅くなる問題が報告されている。40 行の再現コードで debug 情報なしで 1.5 秒、有効時に 50 秒かかり、実際のライブラリでは 40 倍遅化した事例もある。原因は LLVM の Register Stackify パスが WebAssembly のスタック値移動時に DBG_VALUE レコードを非効率に走査・コピーしており、関数内で 26 万個のデバッグレコードが生成されると処理が二次計算量になることだ。LLVM には既に不完全な修正があるが、著者が提案するパッチでは走査時に上下スキャンを組み合わせ、ハッシュテーブル検索を 27.4M から 3.0M に削減し、すべてのターゲットで改善可能と述べた。
あなたへの影響
WebAssembly で Rust を使うプロジェクトでコンパイル時間が異常に長い場合、debug = 0 に落とすか提案パッチの適用を検討する価値がある。
推奨:ただしデバッグ情報を完全に消すとスタックトレース可視性が失われるため、本番前に LLVM 修正の WASM バックエンド統合を確認すべき。