質問

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番目に推測するのですか?データでプロファイルを作成し、どれが最適かを確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top