我做了我正在運行的程序的一些分析和最花費時間的越來越從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