我是Linq的粉絲,對於打字,清晰和簡潔,我很感興趣。但是我發現,與舊的數據視圖相比,搜索匹配記錄的速度非常慢,大約是2000倍!Linq對象與數據視圖相比非常緩慢
我正在寫一個應用程序來備份大量文件 - 500,000個文件和500 gb的數據。我在備份集中創建了一個文件清單,並將目錄中的文件與清單中的文件進行比較,以記錄已備份的內容。這樣我就知道哪些文件已經更改,因此需要複製。
緩慢步驟是這樣的一種:
var matchingMEs = from m in manifest where m.FullName == fi.FullName select m;
其中manifest = List<ManifestEntry>
和ManifestEntry
是一個相對簡單POCO。
整體表現爲每秒17-18個記錄。
當我使用一個數據視圖:
DataView vueManifest = new DataView(dt, "", "FullName", DataViewRowState.CurrentRows);
接在迴路中找到匹配的清單條目用.FindRows:
matchingMEs = vueManifest.FindRows(fi.FullName);
...然後我得到每秒大約35,000個文件吞吐量!
這是正常的嗎?我不能相信Linq會有這樣的代價。 Linq還是物體會讓事情變得緩慢?
(順便說一句,我嘗試使用一個Dictionary
和SortedList
還有List<ManifestEntries>
,他們都給出了一個關於同樣的結果。)
如果您使用字典獲得相同的錯誤結果,我假設您正在初始化它不正確。請顯示相應的代碼。另外,請顯示'm.FullName'的限制。 「fi」是什麼類型?更多:'FindRows'返回所有匹配的行。您的foreach循環結果不會執行任何搜索。與此相反,LINQ使用延遲執行,並將在您的'foreach'循環內執行搜索。爲了正確比較運行時間,需要比較LINQ'foreach'和'FindRows' + foreach'循環的持續時間。 –
這看起來不正確。 ManifestEntry.FullName在做什麼?它是從文件加載嗎? –
我想你首先運行LINQ查詢,然後是數據GRIDEVIEW查詢,在這一步中,所有文件加載,所以數據網格運行速度快,但如果你反轉執行路徑,你會得到另一個結果。 –