我指的是文章,它侧重于加速LINQ查询。它提到的技术之一是“使用编译后的查询”,并解释了如何使用它。
我希望看到编译查询的性能提高,因此我尝试了作者提供的相同示例。我用Northwind作为数据文本。我尝试了正常执行和编译查询执行,并在LINQ上检查了它们。
首先,我尝试使用在不使用的情况下执行查询CompileQuery。花了2.065秒。
var oo = from o in Orders
where o.OrderDetails.Any (p => p.UnitPrice > 100)
select o;
oo.Dump ("Order items with unit price more than $100");
var oo1 = from o in Orders
where o.OrderDetails.Any (p => p.UnitPrice > 10)
select o;
oo1.Dump ("Order items with unit price more than $10"); 其次,使用对进行CompileQuery查询。花了2.100秒。
var oo = CompiledQuery.Compile ((TypedDataContext dc, decimal unitPrice) =>
from o in Orders
where o.OrderDetails.Any (p => p.UnitPrice > unitPrice)
select o
);
oo (this, 100).Dump ("Order items with unit price more than $100");
oo (this, 10).Dump ("Order items with unit price more than $10");重新执行它们几次表明,这两种方法所花费的时间几乎是相似的。
在这里,我们只看到每个方法的两个查询执行。我试着对每个查询进行了10个查询。但他们都完成了大约7秒。
预编译查询真的能提高性能吗?还是我弄错了它的用法?
感谢您的时间和考虑。
编辑:在阅读了被接受的答案后,读者可能还想要阅读这篇文章,这很好地解释了编译后的查询如何提高性能。
发布于 2012-04-05 04:32:08
请记住,LINQ查询的两个主要部分可能特别昂贵:
在您的例子中,您有一个相对简单的查询,或者是一个非常慢的数据库连接、一些非常大的数据集,或者是没有以最佳方式进行索引的表来运行这个特定的查询。或者是三者的结合。
因此,与为查询生成SQL所需的时间(可能为10-50毫秒)相比,第二步所花费的时间太长(~1000 ms),以至于您很难注意到两者之间的差异。
如果以下条件都为真,您将看到显著的改进:
实际上,我的查询可能需要500 to以上才能编译,但实际运行的时间只有几毫秒。通常情况下,我将重点放在预编译查询上。
提前知道从预编译查询中可以获得何种性能的一个好方法是使用Stopwatch对象对查询的第二个实例进行计时,然后使用LINQPad的Analyze特性直接运行生成的SQL。如果SQL查询返回得很快,但是LINQ查询需要很长时间,那么这是预编译的一个很好的候选。
https://stackoverflow.com/questions/10022672
复制相似问题