世界を動かす技術を、日本語で。

Rustコンパイラはなぜこんなに遅いのか?

2025年6月27日原文(sharnoff.io)

概要

  • RustアプリのDockerデプロイでビルド時間の問題に直面
  • 標準的なDockerビルドでは毎回フルビルドが発生し非効率
  • cargo-chefなどのキャッシュ戦略で依存関係の再ビルドを削減
  • ビルド時間の大半はLTOやLLVMの最適化処理に集中
  • ltoやdebug設定の調整でビルド速度・バイナリサイズのバランス改善可能

RustアプリをDockerで高速にビルド・デプロイしたい話

  • Rust製Webサイト のデプロイを従来の「静的バイナリ転送+再起動」から Dockerコンテナ方式 へ移行を決意
  • 普通のDockerfile (rust:alpineイメージ+muslターゲット)では 毎回全ビルド が走り、4分以上かかる現実
  • cargo-chef を利用し、依存クレートのビルドを キャッシュレイヤ として分離
    • 依存関係に変更がなければ再ビルド不要
    • しかし、アプリ本体のビルド時間が依然として長い(2分50秒など)
  • 依存関係ビルド は全体の25%程度、 本体ビルド が大半を占める傾向

rustcのビルド時間の内訳調査

  • cargo --timings でビルド各工程の所要時間を可視化
    • ただし最終クレートのビルド時間しか興味がない場合は情報が限定的
  • rustcの自己プロファイリング(-Zself-profile) をRUSTFLAGS経由で有効化
    • measuremeツール群(summarize, flamegraphなど)で詳細解析
    • LTO(Link Time Optimization)LLVM_module_codegen_emit_obj が大半の時間を消費
    • codegen_module_perform_ltoが全体の80%近くを占めるケース

LTOとデバッグ設定の影響

  • Cargo.tomlで lto = "thin"debug = "full" などを設定していたことが判明
    • LTOの種類(off/thin/fat)やdebug情報の粒度で ビルド時間とバイナリサイズが大きく変動
  • LTOを無効化 するとビルドが高速化
    • ただし最適化レベルやバイナリサイズ、実行速度とのトレードオフが発生

DockerでのRustビルド高速化Tipsまとめ

  • 依存関係のキャッシュ にはcargo-chefが有効
    • ただしアプリ本体のビルド最適化も不可欠
  • LTOやdebugの設定 を見直し、用途に応じた最適バランスを選択
  • rustcの自己プロファイリング を活用し、ボトルネック特定
  • ビルド時間短縮パフォーマンス確保 のバランス調整が重要

まとめ

  • DockerでのRustビルド高速化 には、依存関係キャッシュと本体ビルド最適化の両立が必要
  • LTOやdebug設定の見直し で大幅な時間短縮が可能
  • measuremeツール で詳細なプロファイリング・分析が有効
  • 最適化の落とし所 はアプリの特性や運用フローに依存
  • 継続的な ビルド戦略の改善 が効率的な開発・運用の鍵

Hackerたちの意見

あの人、ちょっと混乱してるみたいだね。単一の静的リンクバイナリをインストールする方が、コンテナを管理するより明らかに簡単じゃない?

記事からすると、目的は簡素化じゃなくて、むしろモダン化だったみたいだね。>「だから、代わりにコンテナ(DockerやKubernetesなど)を使ってウェブサイトをデプロイしたいと思ってる。過去10年間にデプロイされたソフトウェアの大多数に合致するから。コンテナには多くの利点がある。例えば、プロセスの隔離、セキュリティの向上、標準化されたログ、成熟した水平スケーラビリティなど。」

なんか、Dockerが何をしてるのか完全に理解してない感じがするな。Dockerイメージで全てをビルドすることについての言及があって、「残念ながら、何か変更があるたびに全てをゼロから再ビルドすることになる。」って。これって、ビルダーが一人だけで、CIやCDが必要ない場合には、ローカルの便利さを利用してローカルでビルドして、その結果をDockerコンテナに取り込むのは全然問題ないよ。もしパスに気になるものがあったら、誤ってパスを追加する設定を再確認してね。(私の場合、単に「はい、私のユーザー名の誰かがビルドしました」ってことがわかるだけで、「src」ディレクトリがあるってこともわかる...この情報を公にしたってことは、どれだけ気にしてるかってことだね。)プロの環境でCI/CDを使うのは、ハードドライブや磁気針、最小限のカーネルをスクラッチするために訓練された猿からプロジェクトをビルドできることを確保するためにはいいけど、個人プロジェクトにはそんなの必要ないよ。

その通り。読んだ瞬間にグルグ脳の開発者を思い浮かべたよ。

元C++開発者として、Rustのコンパイルが遅いっていう主張には首をかしげちゃうな。

Cのカプセル化やコンパイルのステップを減らす作業はすごく楽しんでるんだけど、C++が来て、全てにテンプレートを要求することでほとんどを元に戻しちゃうのが残念だな。うっかり一つのヘッダーのテンプレートを変えたら、それが... 98%のコードに影響するんだよね。

それが、RustがC++の開発者をターゲットにしている理由の一つだね。C++の開発者は、ツールを受け入れるために必要なストックホルム症候群をすでに持ってるから。

絶対的な意味で遅いこともあるけど、C++ほど遅くはないよ。C++のコンパイルに関する問題は非常によく理解されていて、文書化されてる。コンパイル時間が最悪な言語の一つだね。Rustはそういう言語レベルの問題を抱えてないから、期待値が高くなるのは当然だよ。

新機能:はい ユーザーと話して実際の問題を解決する:笑、無理、めんどくさい。

全然遅いとは思わないよ。複雑さ的には他の言語と同じくらいパフォーマンスがあるし、15分かかるC++やScalaのビルド時間よりはずっと速いと思う。

C++のテンプレートがチューリング完全になったら、実際のコードを考慮せずにコンパイル時間について文句を言うのは無意味だよね :)

これもよくわからないんだけど、Rustコンパイラは僕が作業してるときにほとんど気にならないんだ。初期の頃がひどかったから、その印象が残ってるだけなんじゃないかな。

Hacker Newsで議論の続きを見る