リスト全体がそのタイプであるList.OfType <>のパフォーマンスヒットとは何ですか?

c# covariance generics linq
リスト全体がそのタイプであるList.OfType <>のパフォーマンスヒットとは何ですか?

データノードを「IEnumerable」として渡すアーキテクチャがあります。 すべてうまく動作しますが、各サブクラスでは、クラス内のすべてが「AnotherNode」オブジェクトを作成および使用するため、これらを「リスト」として保存します(約15の異なるサブクラスがあります)。

より厳密に型指定されたリストを使用して機能しないのは、型 `IEnumerable`を返すルートクラスメソッドで、.net 3.5の共分散制限があるため返されません。 (当面は.net 3.5を使用する必要があります。)

しかし、 `List data;`があり、 `data.OfType();`を返す場合、問題なく動作します。 だからここに私の質問です。

すべてのデータは「BaseNode」型であるため、この呼び出しのパフォーマンスにどのような影響がありますか? 代替案は、パフォーマンスがわずかに低下する場所にキャストする必要があるためです-しかし、それは、そのタイプを知っているすべてを放棄する状況でもあります。

  3  0


ベストアンサー

2つの小さなこと:

  1. 降伏に関連する小さな、しかし測定可能なオーバーヘッドがあります
    列挙子の各アイテム。 非常にタイトな内部ループにいるためにこれを気にする必要がある場合、実際にはリストのforループを直接反復処理する方が良いでしょう。 ほとんどの場合、これは重要ではありません。

  2. 結果は「IEnumerable」であり、すでにフィルタリングされているため
    降伏列挙関数を介して、Count()やElementAt()などのメソッドへの後続の呼び出しは、リストのLINQ実装の最適化を利用しません。 また、これらの拡張メソッドを頻繁に使用し、非常に多くの要素を持たない限り、これが問題になることはほとんどありません。

9


http://msdn.microsoft.com/en-us/library/bb341406.aspx [Cast()] Linq演算子を見ましたか? `OfType()`よりもパフォーマンスが高いはずです。

基本的に、 `OfType()`で実行される条件があります

if (item is T) {
    yield return (T)item;
}

それを `Cast()`が行うことと比較してください:

yield return (T)item;

8


タイトルとURLをコピーしました