我做了我正在运行的程序的一些分析和最花费时间的越来越从LINQ查询结果的事情:通过分组linq结果的过程非常缓慢,任何提示?
var Results =
from a in Table
group a by a.Value into b
select new {Group = b};
foreach(var Result in Results)
{
//Do calcs
}
我如何能加快这任何想法?
我做了我正在运行的程序的一些分析和最花费时间的越来越从LINQ查询结果的事情:通过分组linq结果的过程非常缓慢,任何提示?
var Results =
from a in Table
group a by a.Value into b
select new {Group = b};
foreach(var Result in Results)
{
//Do calcs
}
我如何能加快这任何想法?
我想你是查询对象与该查询的结果混淆。你的第一个变量不包含结果,它包含一个查询对象。此时查询尚未执行。执行被延迟直到你真正需要结果,并且在你的例子中,当你在foreach循环中进行迭代时,这是完成的。这就是为什么第一个语句执行得很快但迭代很慢。
如果要将查询结果存储在results
中,以便它们在您开始foreach循环时已经计算出来,请向ToList()添加一个调用。
var results =
(from a in Table
group a by a.Value into b
select new {Group = b}).ToList();
但是这会使它(整个发布的代码)更快吗? – 2010-09-17 20:22:43
我怀疑它,但要确定你应该测量。它会做的是预先执行成本,以便迭代更快。在我看来,OP的担心更多的是迭代速度惊人地慢,而不是代码的总运行时间太慢。如果你不确定幕后发生了什么,那么你可能会认为第一行是慢的,而且循环要快。 – 2010-09-17 20:31:39
我有一个列表128000项。有它按照productid分组。做了钥匙的地方,然后跑过去。它花了0.10秒。在IEnumerable
如果您使用.NET 4,看看P-LINQ或Parallel ForEach循环。这应该会显着提高性能。
根据给出的信息无法真正辨别,但可能是SQL查询花费的时间太长?
如果是ForEach循环确实会导致瓶颈,那么Parallel ForEach将是您最好的选择。
如果是I/O绑定(数据库),一些额外的线程不会有太大的帮助。我认为这取决于(不可用的细节)。 – 2010-09-17 20:25:15
这只会对LINQ到对象有一个潜在的改进,但如果这是使用IQueryable
@Reed,是的,就像Henk说的那样,它完全基于不可用的细节。如果Calcs在foreach循环中完成是问题,这将有所帮助,或者即使LINQ语句针对的是对象集合,但我们并不知道给出的信息。 – 2010-09-17 20:30:31
我只有2000个用于MSChart的Sqlite记录(索引)有同样的问题,显然这是由LINQ组语句查询所有记录引起的。
我发现的唯一解决方案是回到原生SQL,并且使用LINQ和SQlite,图表瞬间呈现,而不是2秒。
我不认为这里有足够的信息。表是什么?它是否在进行数据库调用?什么花了很长时间?只是foreach循环?或者什么是foreach? – Bryan 2010-09-17 20:20:01
看起来像'select new {Group = b}'可能只是'选择b',但是不会加快速度。 – 2010-09-17 20:21:46
分组可能是一项昂贵的操作。如果Table在数据库中,它是否具有Value上的索引? – 2010-09-17 20:23:37