我非常喜欢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>
,他们都给出了相同的结果。)
答案 0 :(得分:1)
您的DataView按全名排序,因此FindRows可以直接跳转到正确的记录,而您的linq查询必须遍历列表,直到它到达正确的记录。 如果您有500,000个条目,这肯定会引人注目。
假设fullname是唯一的,那么当你切换到使用字典时,我会怀疑你仍在使用类似的linq查询迭代它,比如
var matchingME = (from m in manifest where m.Key == fi.FullName select m).Single();
而你应该使用
var matchingME = manifest[fi.FullName] ;