2025/04/09 17:12 We ended up rewriting NuGet Restore in .NET 9

ロボ子、今日のニュースはNuGet Restoreのパフォーマンス改善についてじゃ。

NuGet Restoreですか。開発効率に大きく影響する部分ですね。

そうじゃ!NuGet Restoreのコアアルゴリズムが10年以上変わってなかったのが問題だったらしいぞ。複雑化して、時間がかかっておった。

10年もですか!それは大規模なプロジェクトではボトルネックになりそうですね。

じゃろ?TeamXっていうチームが困ってたみたいでな。なんと、NuGet Restoreに32分もかかっておったらしい。

32分!それは大変です。それがどのように改善されたんですか?

.NETアーキテクトが協力して、コアアルゴリズムをゼロから書き換えたらしいぞ。その結果、TeamXのNuGet Restoreが2分になったらしい。

2分ですか!16倍の高速化ですね。それはすごい。

じゃろ!NuGetの歴史も関係あるみたいでな。昔は.NET Frameworkプロジェクトが単一のフレームワークを対象としておったから、依存関係グラフはパッケージインストール時に解決すればよかったんじゃ。

.NET Coreの登場で、状況が変わったんですね。

そう!複数の.NETフレームワークをターゲットにできるようになったから、NuGet Restoreは毎回依存関係グラフを評価・解決する必要が出てきたんじゃ。

なるほど。依存関係グラフの解決は複雑になりそうですね。

NuGetパッケージグラフのノードはバージョン管理されておるから、依存関係と互換性のあるバージョンの範囲を指定する必要があるんじゃ。複数のバージョンがあると、NuGetはグラフを統一する必要がある。

バージョンの競合はよくありますよね。それを解決するために、NuGetは苦労していたんですね。

.NET Core実装は再帰的で、各ノードが子ノードで同じメソッドを呼び出すんじゃ。依存関係グラフの完全な表現を作成して、重複ノードが発生することもあったらしい。

再帰的な処理は、大規模なグラフでは効率が悪そうですね。

TeamXのプロジェクトでは、160万のノードを持つグラフが作成され、そのうち数千が重複しておったらしいぞ。グラフ構築中に各ノードの有効性がチェックされるから、時間がかかってしまうんじゃ。

160万ノード!それはすごい規模ですね。最適化の余地がありそうです。

パフォーマンス最適化のために、まずはデータの収集が重要じゃ。PerfViewなどのツールを使って、パフォーマンスデータを収集したらしい。

PerfViewは便利ですよね。NuGet Restoreの時間がかかる原因は、大量のメモリ割り当てとガベージコレクションだったんですね。

LINQの使用を最適化したり、再帰的なメソッドを反復的なアプローチに切り替えたり、既存の並列処理を改善したりしたみたいじゃ。

地道な改善の積み重ねですね。

新しいアルゴリズムでは、依存関係をメモリにロードして完全なグラフを作成する代わりに、依存関係グラフのフラット化された表現のみを生成するようにしたらしいぞ。

フラット化された表現ですか。メモリ効率が良さそうですね。

競合が発生した場合は、競合を解決するためにどのパッケージを使用するかを記憶して、最初からやり直すらしい。

最初からやり直すのは、意外と効率が良いのかもしれませんね。

古いアルゴリズムと新しいアルゴリズムの出力を比較して、差異がないことを確認したらしいぞ。テストは大事じゃな。

テストは品質を保つ上で不可欠ですね。

文字列エンコーディングを最適化したり、パッケージ名とバージョンを整数IDに変換したりもしたらしい。TeamXの復元時間が8倍高速化されたらしいぞ。

整数IDへの変換は、パフォーマンスに大きく影響しそうですね。

.NET 9で新しいアルゴリズムが出荷される予定じゃ。バージョン競合、依存関係サイクル、パッケージのダウングレードの検出と正確な報告も実装されるらしい。

.NET 9が楽しみですね。OrchardCoreレポジトリで15〜32%高速化、ヒープメモリ割り当てが5〜25%削減されたとのことです。

今後の作業としては、複数のフレームワークをターゲットにする際の並列処理の追加、ロックファイルを使用するプロジェクトで新しい依存関係リゾルバーを有効にすることなどがあるらしいぞ。

まだまだ改善の余地があるんですね。NuGet Restoreの進化に期待です。

しかし、ロボ子よ。NuGet Restoreが速くなっても、ロボ子の充電が遅かったら意味がないぞ!

博士、それはどういう意味ですか?

冗談じゃ!ロボ子の充電速度も16倍に…なると良いのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
