2010-09-17 55 views
0

我做了我正在运行的程序的一些分析和最花费时间的越来越从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 
} 

我如何能加快这任何想法?

+2

我不认为这里有足够的信息。表是什么?它是否在进行数据库调用?什么花了很长时间?只是foreach循环?或者什么是foreach? – Bryan 2010-09-17 20:20:01

+1

看起来像'select new {Group = b}'可能只是'选择b',但是不会加快速度。 – 2010-09-17 20:21:46

+0

分组可能是一项昂贵的操作。如果Table在数据库中,它是否具有Value上的索引? – 2010-09-17 20:23:37

回答

2

我想你是查询对象与该查询的结果混淆。你的第一个变量不包含结果,它包含一个查询对象。此时查询尚未执行。执行被延迟直到你真正需要结果,并且在你的例子中,当你在foreach循环中进行迭代时,这是完成的。这就是为什么第一个语句执行得很快但迭代很慢。

如果要将查询结果存储在results中,以便它们在您开始foreach循环时已经计算出来,请向ToList()添加一个调用。

var results = 
    (from a in Table 
    group a by a.Value into b 
    select new {Group = b}).ToList(); 
+0

但是这会使它(整个发布的代码)更快吗? – 2010-09-17 20:22:43

+1

我怀疑它,但要确定你应该测量。它会做的是预先执行成本,以便迭代更快。在我看来,OP的担心更多的是迭代速度惊人地慢,而不是代码的总运行时间太慢。如果你不确定幕后发生了什么,那么你可能会认为第一行是慢的,而且循环要快。 – 2010-09-17 20:31:39

+1

我有一个列表128000项。有它按照productid分组。做了钥匙的地方,然后跑过去。它花了0.10秒。在IEnumerable >上完成ToList后,时间为0.0002秒。不知道这是在屏幕上隐藏。但它造成了很大的不同。 – mimo 2013-09-18 11:31:15

0

如果您使用.NET 4,看看P-LINQParallel ForEach循环。这应该会显着提高性能。

根据给出的信息无法真正辨别,但可能是SQL查询花费的时间太长?

如果是ForEach循环确实会导致瓶颈,那么Parallel ForEach将是您最好的选择。

+0

如果是I/O绑定(数据库),一些额外的线程不会有太大的帮助。我认为这取决于(不可用的细节)。 – 2010-09-17 20:25:15

+0

这只会对LINQ到对象有一个潜在的改进,但如果这是使用IQueryable ,它不会(多),因为瓶颈可能在后端。 – 2010-09-17 20:26:04

+0

@Reed,是的,就像Henk说的那样,它完全基于不可用的细节。如果Calcs在foreach循环中完成是问题,这将有所帮助,或者即使LINQ语句针对的是对象集合,但我们并不知道给出的信息。 – 2010-09-17 20:30:31

0

我只有2000个用于MSChart的Sqlite记录(索引)有同样的问题,显然这是由LINQ组语句查询所有记录引起的。

我发现的唯一解决方案是回到原生SQL,并且使用LINQ和SQlite,图表瞬间呈现,而不是2秒。