2010-11-24 7 views
5

私はいくつかのコレクションオブジェクト(辞書、リスト)に対してLinqを使用しました。したがって、基準に基づいて項目を選択する場合は、Linqクエリを記述してからlinqオブジェクトを列挙します。だから私の質問は、主なコレクションをループすることを取り除き、結果としてパフォーマンスを向上させるLinqです。LINQはループを排除してパフォーマンスを向上させますか?

+8

LINQは魔法ではありません。 –

+6

私は誰かがIEnumerable を一度帽子から引っ張っているのを見た..... –

答えて

8

絶対にありません。 LINQ to Objectsは内部的にループします - 他にどのように動作するのですか?一方

、LINQ は、これは必須です場合にのみ、第三一方でなど

データをストリーミングすることで、あなたが取ることができるいくつかのアプローチよりも、より効率的である、それは間接の余分な層を必要とする(すべてのイテレーターなど)を使用して、パフォーマンスに多少の影響を与えます。

+10

Aha!私は知っていた*あなたは3つの手を持っていた。 –

+0

私はLinq-to-Objectsが '非普通でない'シナリオでは効率が悪いことを知ります。 – NLV

+0

ああgawd ...これはもう一度ない。 @NLV、あなたはどのように非効率的な数量化しますか?コーダーの時間がかかるハードウェア(レンタルされたハードウェアさえ)とLinqが提供する時間の節約につながるとすれば...通常、コードの約90%は性能に重大ではないという事実と相まって、 linqは非効率的です。 – spender

2

LINQは、(うまくいけば)読みやすいコードを簡潔にするのに役立ちます。

バッキングデータ構造がスキャンよりも効率的な検索アルゴリズムをサポートしていない限り、カバーの下にループがあります。

+0

"バッキングデータ構造がスキャンよりも効率的な検索アルゴリズムをサポートしている場合を除きます" - この最適化がそのクエリ演算子に特別に組み込まれていない限り、これは一般的に真ではありません。例えば、Skipは私が知る限りリストには最適化されていません。現在、コレクションがLINQ to Objectsクエリを「フック」する方法はありません。 – Ani

+2

私が「そうしない限り...」 –

+0

私の主張は、バッキングデータ構造がサポートしているかもしれないが、LINQ to Objectsはこのサポートを使用しない可能性があるということです。 – Ani

2

LINQ to SQLを使用している場合、LINQは結局ado.netスタックの上にある追加レイヤーなので、パフォーマンスは少し悪くなります。

オブジェクトにlinqを使用している場合。 linqによって行われる最適化がありますが、最も重要なのは、生成されるとIEnumerableから結果を得るための "Yield"です。これは、リストが繰り返し処理されるのを待たなければならない標準的なアプローチより優れています。

+0

LINQ to SQL:両方のクエリが同じになるまで真。すべてを取り戻してからLINQを使用してオブジェクトをフィルタリングする場合は、処理が遅くなる可能性があります。オブジェクトへのLINQ:既にプレフィックスリストがある場合、それは高速になりません。それは本当にシーンの裏に何が起こっているかによって大きく左右されます。 –

1

クエリを直接使用すると、コレクション全体がループされます。 クエリはフィルタに一致する要素のみを返すため、すべてが表示されません。 全体的なパフォーマンスは、関連するネストされたイテレータのために、おそらくヒットします。 クエリ結果にToList()を呼び出して、この結果を何回か使用した場合、パフォーマンスに優れた方がよいでしょう。

関連する問題