与dataview相比,Linq对象的速度非常慢

时间:2011-09-06 07:09:59

标签: performance linq poco

我非常喜欢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还是降低速度的对象?

(顺便说一句,我尝试使用DictionarySortedList以及List<ManifestEntries>,他们都给出了相同的结果。)

1 个答案:

答案 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] ;