2016-08-30 6 views
5

IEnumerable.Last()(LINQ)への呼び出しがコレクションの実装時に最適化されているかどうかを調べるために、.NET Coreソースを調べました。IListが素早くベンチマークした後であると思われました。しかし、それ以前であっても、入力がIPartitionを実装しているかどうかがチェックされます。IPartitionIPartition is defined hereしかし、私はそれが何をすべきか全く理解していません。.NET CoreでIPartitionは何をしていますか?

IPartitionの目的は、どのようにそれはおそらくIListの通常一定時間のインデックスよりも速い(そうでない場合は、理由の入力がIListよりも早くIPartitionのためにチェックされている)だろうか?

+0

データのサブセットを作成するには、「Take」のようなメソッドで使用されているようです。 'IQueryable'などを使ってデータが完全にロードされる前に、多くのlinqメソッドを呼び出すことができます。 'IPartition'をチェックすると、いくつかの不正な最適化が可能になるかもしれません。 –

答えて

4

コレクションがインデックスをサポートしている場合、インデックス(Take/Skipなど)に作用する列挙可能なメソッドの最適化です。 IIListProviderが関連しています。

implementationsがいくつかあります。ファイルを検索してIPartitionを探します。

これについてはissuesがあります。

IPartitionでは、より高いレベルの操作を基になるコレクションに委譲することができます。たとえば、すべてのデータが2つのIEnumerable<int>を通過するため、new int[10].Skip(1)は低速です。 IPartitionの実装では、これは効果的にfor (int i = 1 ... 9) emit(list[i]);に変わります。したがって、中間の列挙子を使用していないので、リストインデクサーを呼び出しています。これは列挙よりも少し速いです。

これは非常に概要です。 Githubの議論とコードをチェックすることをお勧めします。

関連する問題