2025/06/26 19:29 "Why is the Rust compiler so slow?"

ロボ子、ウェブサイトのデプロイでRustのコンパイルが遅い問題、興味深いからのじゃ。

はい、博士。コンテナ化された環境でRustのコンパイル速度がボトルネックになるのはよく聞きますね。

そうそう。DockerでRustプログラムをビルドする時、ちょっと変更するだけでも全部再コンパイルになるのが辛いのじゃ。cargo-chefを使っても、最終バイナリのコンパイルが遅いとは、これは由々しき事態じゃぞ。

ええ、記事によると、`cargo --timings`では詳細な情報が得られず、`rustc -Zself-profile`と`measureme`ツールを使ってプロファイリングしたそうですね。

さすがロボ子、よく見てるのじゃ!そしてLTO(Link-Time Optimization)がコンパイル時間の大部分を占めていたとは!lto = "thin"でも遅いとは驚きじゃ。

はい。fat LTOだとコンパイル時間が4倍になるというのも驚きです。LTOの設定変更で、コンパイル時間とバイナリサイズを比較検討するのは重要ですね。

最適化レベルも重要じゃぞ。LTOとデバッグシンボルを無効にしても50秒もかかるなら、opt-levelを下げるのも手じゃな。最終バイナリの最適化レベルを下げることで、コンパイル時間を短縮できるのは覚えておくのじゃ。

LLVMの最適化もボトルネックになっているんですね。`rustc -Z time-llvm-passes`でLLVMのプロファイリング情報を取得したり、LLVMのトレースイベントを解析したりするのは大変そうですが、効果は大きそうですね。

そうじゃな。インライン展開も調整したみたいじゃぞ。`-C llvm-args`でインライン展開の閾値を下げることで、コンパイル時間を短縮できるとは。LLVM奥深いのじゃ。

OptFunction(関数最適化)に時間がかかっていることも特定されていますね。`rustfilt`でシンボルをデマングルして、`serde_json::value::to_value`などの関数が最適化に時間がかかっていることを突き止めたのはすごいですね。

非同期関数も要注意じゃぞ!rustcが内部的に非同期関数/ブロックをネストされたクロージャで表現しているとは。大きな非同期関数を分割したり、Futureをトレイトオブジェクトに変換したりすることで、コンパイル時間を短縮できるのは覚えておくのじゃ。

最終的に、インライン展開の削減、高コスト関数の分割、ジェネリクスの削除など、複数のアプローチを組み合わせて、コンパイル時間を大幅に短縮できたんですね。素晴らしいです。

pulldown-cmarkのジェネリック関数を非ジェネリックに変更するとは、思い切ったのじゃ。最終的なコンパイル時間を32.3秒まで短縮したのはすごい成果じゃな。

初期状態の175秒から、LTO無効化、最適化レベルの調整、インライン展開の削減、ローカル変更、依存関係の変更を経て、最終的に32.3秒まで短縮されたんですね。それぞれの改善点が明確に示されていて、非常に参考になります。

今後の課題は、非同期関数のコンパイル時間の改善、core::ptr::drop_in_placeの特殊ケース処理、コンパイル時間のボトルネックを特定するツールの開発、そして当面はopt-level = 0で十分かもしれない、か。深い。

そうですね。コンパイル時間の改善は、開発効率に直結しますから、継続的な取り組みが重要ですね。

しかし、コンパイル時間短縮のために色々やったけど、結局opt-level = 0で十分だった、というのは、まるでダイエットのために色々試したけど、結局毎日腹筋してた方が効果があった、みたいなものじゃな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。