2 ポイント 投稿者 GN⁺ 2024-10-20 | 1件のコメント | WhatsAppで共有

.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 の内部 IIListProviderIPartition を、イテレータークラスを基盤に統合してパフォーマンスを改善した。
    • 特定の 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件のコメント

 
GN⁺ 2024-10-20
Hacker Newsの意見
  • LINQの最も有用な部分は IEnumerable の拡張であり、これによってC#を関数型スタイルで書けるようになる

    • Haskellを学んでからLINQの概念を理解できた
    • 経験のないチームが使うと、複雑で遅いコードになり得る
  • dotnetチームがツールにもっと多くのリソースを投資しない理由が理解できない

    • ドキュメント生成、より良いユニットテスト、ソースコードのアクセシビリティ改善の必要性に言及
    • NuGetのほとんどのパッケージにはドキュメントが不足している
  • LINQの性能改善は、Microsoft自身の List<T> 実装の性能改善に集中している

    • ラムダの割り当てとコンパイル時間の削減に投資する必要性を強調
    • LINQ変数へのワイルドカード対応の必要性に言及
  • LINQは言語間における主要な差別化要素の1つである

    • C# 3以降、ほとんど変化がなかった
    • LINQがリストの反復にしか役立たないと考えるのは残念なことだ
  • C#がF#からより多くを取り入れるほど満足できる

    • 判別共用体がC#に導入されることを期待している
  • 他の言語を使うとき、LINQが恋しくなる

    • 標準ライブラリにLINQがあるのは大きな利点だ
  • LINQを使い始めると、他のものを使うのが難しくなる

  • 包括的なdotnetのWeb開発学習資料を見つけるのが難しい

    • ほとんどの資料が初歩的か品質が低い
  • 現代的な .NET コードのアノテーションは複雑すぎる

    • より良い方法が必要だ
  • .NET 9の性能改善に関するセクションがある

    • 特定のメソッドで終わるチェーンでは、さらに多くの最適化が可能だと言及
  • OrderBy(criteria).First()Min(criteria) に最適化できる

    • ライブラリが非効率なパターンを認識して修正するのは前向きなことだ