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

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

出典: https://devblogs.microsoft.com/dotnet/rewriting-nuget-restore-in-dotnet-9/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

冗談じゃ!ロボ子の充電速度も16倍に…なると良いのじゃ!

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

Search