AsQueriable()またはExpression< T> .Compile()?
-
22-07-2019 - |
質問
Edit2:
ようやく2つのプロファイルを作成できるようになった後、私の状況では.AsQueryable()がExpression.Compile()よりもわずかに速いようです。
元の質問:
私はいくつかのデータベーステーブルのキャッシュを( List< T>
として)実装しました。 Table< T>
自体に対してクエリを実行するときに使用します。
これらの最速/最良の方法は何ですか:
List<T>.AsQueryable().FirstOrDefault(Expression<Func<T, bool>>)
または
List<T>.FirstOrDefault(Expression<Func<T, bool>>.Compile())
?
編集: WhereをFirstOrDefaultに変更しました。これは私が使用している方法です。質問を書いたとき、私は少し疲れていたと思います。 FirstOrDefaultは、Whereのようにすべてのアイテムを1回検査しますか、それとも最初のヒットで(実際に)停止しますか?
解決
いつものように、より高速なものを判断する最良の方法は、試してみることです:
リストのフィルタリング&lt;&gt;単純なWhereを使用すると、常に各項目が1回検査されます。リストが特定の順序でソートされるなどのさらなる仮定がない限り、他に方法はありません。つまり、指定した2つのバージョンは、式の評価がまったく同じになります。
同じ式を複数回使用する場合、データを小さくして式を複雑にする必要がありますが、それをコンパイルしてデリゲートをキャッシュするとメリットが得られます。
編集: Queryableを実行すると、()=&gt;など、実際には入力にまったく依存しない式の場合、おそらく高速になります。 false。
他のヒント
実行する操作の数、および式の実行のプロセッサ強度に依存します。
ストップウォッチまたはその他の診断コンポーネントを使用して、これを簡単にテストできます。
なぜ2番目に推測するのですか?データでプロファイルを作成し、どれが最適かを確認してください。