11月4日、Nicholas Nethercoteが「How to speed up the Rust compiler in November 2026」と題した記事を公開した。Rustコンパイラのビルド速度とメモリ使用量を改善するために行われた各種最適化の取り組みについて詳しく紹介している。
Rustコンパイラのビルドが遅いという不満はRustコミュニティの長年の課題だ。その改善に専業で取り組むのがNethercoteで、パフォーマンス改善に特化したスポンサー企業 Hexcat に在籍し、定期的に成果報告記事を公開している(過去の記事一覧)。今回は2026年9月末から11月初旬にかけての約1ヶ月分の報告だ。計測結果では平均wall-timeが**2.85%、ピークメモリ(max RSS)が4.46%**それぞれ削減された。複数の改善が積み重なってこの数字を達成している。
最大の成果:Span圧縮アルゴリズムの刷新
今回最も効果が大きかった改善は、Span(スパン) データ構造の圧縮方式の見直しだ。
SpanはRustコンパイラの中核をなすデータ構造で、AST・HIR(High-level Intermediate Representation)・MIR(Mid-level Intermediate Representation)のすべてのノードが必ず一つのSpanを持つ。各Spanは以下の4フィールドで構成される:
lo/hi: ソースコード上の位置(ソースファイルを連結した単一バッファへのインデックス)context: マクロ衛生(hygiene)や来歴(provenance)情報parent: インクリメンタルビルド時に小さな変更の影響を最小化するための相対位置
4フィールド合計で16バイトのデータだが、パターンを利用して8バイトのインライン形式に圧縮し、それが難しいケースはグローバルテーブルにインターン(intern:同一データを1か所に格納して参照を共有する手法)する設計になっている。
PR #163857 でNethercoteはこの圧縮アルゴリズムをより単純かつ効率的なものに置き換えた。結果、インクリメンタルビルドでのインターン率が従来の20〜40%から約1%に激減した(非インクリメンタルビルドでは0.1%未満)。多くのベンチマークで命令数(instruction count)が最大3%以上削減され、サイクルカウントの改善はそれ以上だったという。
続く PR #163971 では Rustコアコントリビューターの Josh Triplett がこの新しい表現を活用してSpan操作をマイクロ最適化し、さらに最大2%以上の命令数削減を達成した。
また PR #163628 では、メタデータのエンコード・デコードおよびstableハッシュ計算において同一の親スパン情報を繰り返しハッシュテーブルから引く処理に1エントリのキャッシュを追加。最大4%以上の命令数削減につながり、特にインクリメンタルコンパイルで効果が大きかった。
新トレイトソルバーの速度改善
Rustは現在、既存のトレイト解決エンジンを置き換える新トレイトソルバー(-Znext-solver フラグで試験的に利用可能)を開発中だが、一部のクレートでは旧ソルバーより遅いという課題があった。特に問題だったのがORMクレートの Diesel で、型推論の複雑さから新ソルバーのオーバーヘッドが顕著だった。
PR #163981、#164234、#165160 の3本のPRで、ホットパスへの早期リターン追加、アロケーション回避、一部の再計算の削除といったマイクロ最適化を積み重ねた。その結果、Check Fullビルドにおける新ソルバーのオーバーヘッドが1.49倍から1.16倍に低下した。型レベルの計算を多用する typenum や nalgebra といったベンチマークでも改善が確認されている。
その他の最適化
ストレステスト限定の大きな改善: PR #164965 では vec![1, 2, 3, 4] のようなリテラルにおいて要素ごとに型変数を生成していた処理を修正した。deep-vectorストレステスト(10万要素超のvecリテラル)ではサイクルカウントが8〜12%削減されたが、実際のコードへの影響はほぼない。ただしコードが非常にシンプルでエラーメッセージの改善も伴うためマージされた。
メタデータサイズの削減: PR #164484 でコントリビューターの Takayuki Maeda がメタデータのスパースエンコーディングを導入した。命令数はわずかに増加したが、メタデータサイズを最大37%削減、ピークメモリ使用量を最大7%削減という大きな効果をもたらした。
trivial_constsの拡張(ドラフト): PR #165112 では const N: usize = 0 のような自明な定数のMIR構築をスキップする仕組みを実装した。libcでは命令数が最大6%削減されたが、扱いが難しく議論もあるため、今後の対応方針は未定だという。
1ヶ月の総括
2026年9月28日から11月2日の計測結果では、45ベンチマーク・236テストが改善した一方、悪化は3ベンチマーク・4テストにとどまった。wall-timeは平均2.85%、ピークメモリは平均4.46%削減されている。
さらに年初来(2026年1月1日〜)の命令数変化では、561件の計測中560件が改善、悪化はわずか1件という結果だった。コントリビューターの Matyáš Racek がこれを指摘した数週間前の時点では全件グリーンだったという。言語機能の追加が続く中でコンパイラが一貫して速くなり続けているのは、rust-lang/rustのperf計測基盤による継続的な計測と、小さな改善を愚直に積み重ねてきた成果だ。Rustのビルド速度改善は一朝一夕には実現しないが、この報告を読むと着実に前進していることがわかる。
詳細はHow to speed up the Rust compiler in November 2026を参照していただきたい。