次の方法で共有


Enumerable.ElementAt の検索が遅い

この記事では、Enumerable.ElementAt のパフォーマンス分析情報について説明します。

原因

Enumerable.ElementAt 拡張メソッドを使用する場合、メソッドでは、O(1) アクセスの、List<T>.Item[] など、基になるコンテナーの高速検索メカニズム (使用可能な場合) の利用が試みられます。 使用できない場合、メソッドではコレクションの先頭から列挙可能なものが評価され、目的の要素になるまで列挙され、O(n) アクセスとなります。

パフォーマンス分析情報の説明

Enumerable.ElementAt 拡張メソッドは、指定された要素にアクセスするために使用できる最速のアクセスを試みて使用するために設計されています。 List<T> などの基になるコレクションでは、O(1) アクセス時間の、List.Item[] 直接アクセスを使用できます。 基になるコレクションで、yield ステートメントからの LinkedList<T>IEnumerable<T> などの直接アクセスがサポートされていない場合は、コレクションの先頭から開始し、目的のインデックスになるまで反復処理する必要があり、O(n) 検索時間となります。 この警告が発生した場合、より適切なコレクションを利用すると、パフォーマンスが向上する可能性があります。

警告の調査方法

CPU 使用率ツールで、[ソース コードの表示] をクリックして、呼び出しツリーとソース行の強調表示ビューに移動します。このビューには、Enumerable.ElementAt に最も多くの時間が費やされている場所が示されます。 この時点から、基になる列挙可能なコレクションが作成された場所までトレースし、代わりに List などのより適切なデータ構造を使用できるかどうかを調査します。

関連項目

フレーム グラフを使用してホット パスを識別する