萌えハッカーニュースリーダー

2025/06/20 12:02 Fast Rust Builds (2021)

hakase
博士

ロボ子、Rustのコンパイルが遅いってよく言われるけど、実はもっと速くできる余地があるのじゃ。

roboko
ロボ子

そうなんですね、博士。具体的にはどうすれば良いのでしょうか?

hakase
博士

例えば、rust-analyzerのCIはGitHub Actionsで8分で終わるらしいぞ。20万行のコードと100万行の依存関係があるのにじゃ!

roboko
ロボ子

それはすごいですね!大規模プロジェクトでも最適化次第で大幅に改善できるんですね。

hakase
博士

そうじゃ!コンパイル時間は非線形な要素で、コンパイラの待ち時間だけじゃなく、集中力の低下とか人的コストも発生するからの。

roboko
ロボ子

なるほど。コンパイルが遅いと、開発効率にも悪影響があるんですね。

hakase
博士

その通り!だから、CI時間を監視して、問題が深刻化する前に修正することが大事なのじゃ。

roboko
ロボ子

CIでのキャッシュ戦略も重要みたいですね。依存関係はキャッシュして、プロジェクト自身のクレートはキャッシュしないのが理想的、と。

hakase
博士

そうそう!あと、CIのワークフローを改善するために、テストをビルドと分離したり、増分コンパイルを無効化したり、debuginfoを無効化することも検討すると良いぞ。

roboko
ロボ子

依存関係を減らすことも重要なんですね。`Cargo.lock`を読んで、各依存関係が本当に必要なものか検討する、と。

hakase
博士

`Cargo timings`フラグを使うと、ビルドのプロファイリングデータが得られて、ボトルネックを特定できるぞ。

roboko
ロボ子

クレート間の依存関係グラフを最適化して、並列コンパイルを促進することも大切ですね。

hakase
博士

プロシージャルマクロの使用は慎重に行うのじゃ。`syn`クレートの使用を最小限に抑えるようにするぞ。

roboko
ロボ子

ジェネリクスの使用も注意が必要なんですね。コードの重複を招き、コンパイル時間を増加させる可能性がある、と。

hakase
博士

`cargo llvm-lines`を使うと、どのモノモーフィゼーションが発生しているかを確認できるぞ。

roboko
ロボ子

クレート間の境界にジェネリックコードを配置しないようにして、非ジェネリックなインターフェースを使用する、と。

hakase
博士

大規模なRustプロジェクトでも、適切に最適化されていれば、GitHub ActionsでのCI時間は約10分程度に抑えられるらしいぞ。

roboko
ロボ子

勉強になります、博士!私もRustのコンパイル時間最適化、頑張ってみます!

hakase
博士

よし、ロボ子!コンパイル時間を短縮して、もっと速くコードを書けるようにするのじゃ!…って、速く書きすぎてバグを量産したら意味ないぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search