NET 9.0 LINQ のパフォーマンス改善点
(blog.ndepend.com).NET 9.0 LINQ のパフォーマンス改善
-
Span<T>を使った反復- .NET 9.0 では LINQ のパフォーマンスが大幅に改善された。
Span<T>を使って配列を反復すると、パフォーマンスが向上する。TryGetSpan()メソッドを使って配列やリストをReadOnlySpan<T>に変換し、反復速度を高める。
-
TryGetSpan()メソッドTryGetSpan()は配列やリストをReadOnlySpan<T>に変換し、反復パフォーマンスを改善する。- コード最適化は細かな部分で行われており、パフォーマンスの専門家が書いたコードである。
- リストの内部配列は変更される可能性があるため、
CollectionsMarshal.AsSpan()の使用には注意が必要である。
-
TryGetSpan()の呼び出し元TryGetSpan()を呼び出すメソッドを分析すると、多くのEnumerableメソッドが配列またはリストの場合にスパンを使おうとしていることが分かる。yieldを使う演算では、この最適化を利用できない。
-
特殊化されたイテレーター
- LINQ の内部
IIListProviderとIPartitionを、イテレータークラスを基盤に統合してパフォーマンスを改善した。 - 特定の LINQ 呼び出しチェーンを認識し、効率的に処理する特殊イテレーターを生成する。
- LINQ の内部
-
Iterator<T>と派生クラスの実装Iterator<T>は抽象クラスであり、派生クラスは必要なメソッドだけをオーバーライドする。ListWhereSelectIterator<TSource, TResult>はWhere(...).Select(...)チェーンを単一のイテレーターで処理し、パフォーマンスを改善する。
-
IListSkipTakeIterator<TSource>のケーススタディMoveNext()メソッドは不要な反復を避け、_minIndexInclusiveと_maxIndexInclusiveの範囲内にある要素だけを処理する。
GN⁺のまとめ
- .NET 9.0 では LINQ のパフォーマンスが大幅に改善されており、特に
Span<T>とTryGetSpan()を使って反復パフォーマンスを高めている。 - LINQ の内部構造が最適化され、特定の呼び出しチェーンを認識して効率的に処理する特殊イテレーターを生成する。
- これらの改善はコードのパフォーマンス向上に役立ち、最新の .NET バージョンへ移行することでこの利点を享受できる。
- LINQ と似た機能を提供する他のライブラリとして
System.Linq.Asyncがある。
1件のコメント
Hacker Newsの意見
LINQの最も有用な部分は
IEnumerableの拡張であり、これによってC#を関数型スタイルで書けるようになるdotnetチームがツールにもっと多くのリソースを投資しない理由が理解できない
LINQの性能改善は、Microsoft自身の
List<T>実装の性能改善に集中しているLINQは言語間における主要な差別化要素の1つである
C#がF#からより多くを取り入れるほど満足できる
他の言語を使うとき、LINQが恋しくなる
LINQを使い始めると、他のものを使うのが難しくなる
包括的なdotnetのWeb開発学習資料を見つけるのが難しい
現代的な .NET コードのアノテーションは複雑すぎる
.NET 9の性能改善に関するセクションがある
OrderBy(criteria).First()はMin(criteria)に最適化できる