私は異なる順序で実行する操作は、次のスロークエリの違いなど、さまざまなパフォーマンスが得られることを理解:LINQを使用する場合、述語の順序が重要ですか?
List<TestItem> fastResults = items.Where(item => item.IntItem == 100)
.OrderBy(item => item.StringItem)
.ToList();
しかし、それは私ではありません。
List<TestItem> slowResults = items.OrderBy(item => item.StringItem)
.Where(item => item.IntItem == 100)
.ToList();
と1本速いです質問:
私の質問は、 LINQ述語に変換します。この場合のようにWhere句を使用すると、次のようになります。
List<TestItem> results = items.Where(item => item.Item1 == 12 &&
item.Item2 != null &&
item.Item2.SubItem == 65 &&
item.Item3.Equals(anotherThingy))
.ToList();
引数の順序は関係ありませんか?たとえば、.Equalsを最初に実行すると、Item1 == 12の整数評価がはるかに高速な操作であるため、全体的にクエリが遅くなることが予想されます。
注文が問題であれば、どれくらい重要ですか?もちろん、.Equalsのようなメソッドを呼び出すのはおそらく数倍の整数を比較した場合よりもはるかに大きなスローダウンですが、LINQの動作が遅い場合に比べてパフォーマンスが低下しますか? LINQは多くのメソッド呼び出しを行いますが、実際にはエスケープが問題になります。オーバーライドされない限り、ネイティブフレームワークコードを実行します。一方、標準的なMSILメソッド呼び出しは大幅に遅くなるでしょうか?
また、このクエリでは、これをスピードアップしている可能性のある他のコンパイラの最適化がありますか?
ありがとうございました。 Brett
LINQ to what? – SLaks
私はLINQ to Objectsを考えていましたが、その質問はLINQ to SQLにとってさらに重要だと思います。 – Brett
LINQ____はわかりませんが、他の短絡言語の場合は、評価する式が確実に真または偽になると、残りの述語は安全に破棄できるため、順序は重要です。たとえば、式 '(1 == 1 || x == 3)'では、結果が何であっても式は真となるため、 'x == 3'は評価されません。同様の簡単な例は '(1 == 0 && x == 3)'で、 '1 == 0'の後に偽であると判明した場合、式が真となる方法がないので終了します。申し訳ありませんが、これはあなたが探しているものではない場合! – prelic