Asayomu Tech
注目★★★★★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 バックエンド統合を確認すべき。

詳細を読む → 元記事へ※ 本文は元記事をご確認ください (asayomu は要約のみ提供)

関連する記事

※ 外部記事の権利は原著作者に帰属します。著作権削除要請は copyright@asayomu.jp までご連絡ください(受領確認 24h・実処理 72h 以内)。