0

Edit2:
最終的に2つを互いにプロファイルできるようになった後、私の状況では.AsQueryable()はExpression.Compile()よりわずかに高速であるように見えます。

元の質問:
いくつかのデータベース テーブル (として) のキャッシュを実装しました。これは、それ自体に対してクエリを実行するときに使用するList<T>のと同じ方法でクエリを実行する必要があります。Expression<Func<T, bool>>Table<T>

これらの最速/最良の方法は何ですか:

List<T>.AsQueryable().FirstOrDefault(Expression<Func<T, bool>>)

また

List<T>.FirstOrDefault(Expression<Func<T, bool>>.Compile())

?

編集:私が使用している方法であるため、WhereをFirstOrDefaultに変更しました。質問を書いたとき、私は少し疲れていたと思います。FirstOrDefault は、Where のようにすべてのアイテムを 1 回調べますか、それとも最初のヒット (存在する場合) で実際に停止しますか?

4

3 に答える 3

1

ただし、いつものように、どちらが速いかを判断する最善の方法は、試してみることです。

単純な Where を使用して List<> をフィルタリングすると、常に各項目が 1 回検査されます。リストが特定の順序でソートされているなどのさらなる仮定がなければ、実際には他に方法はありません。つまり、指定した 2 つのバージョンが式のまったく同じ評価になるということです。

同じ式を複数回使用する場合は、コンパイルしてデリゲートをキャッシュすることでメリットが得られる可能性がありますが、違いを生むためにはデータが小さく、式が複雑である必要があります。

編集: () => false など、実際には入力にまったく依存しない式の場合、Queryable を通過する方が高速になる可能性があります。

于 2009-10-30T09:48:42.460 に答える
1

実行する操作の数と、式の実行のプロセッサ強度によって異なります。

これは、ストップウォッチまたはその他の診断コンポーネントを使用して簡単にテストできます。

于 2009-10-30T09:37:28.850 に答える
1

なぜもう一度推測するのですか?データを使用してプロファイリングし、どれが最適かを確認します。

于 2009-10-30T09:44:35.190 に答える