【发布时间】:2011-09-06 07:09:59
【问题描述】:
我是 Linq 的忠实粉丝,因为它的打字、清晰和简洁。但是我发现搜索匹配记录的速度比旧数据视图慢了大约 2000 倍!
我正在编写一个应用程序来备份大量文件 - 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>,它们都给出了大致相同的结果。)
【问题讨论】:
-
如果您使用 Dictionary 得到相同的错误结果,我认为您未正确初始化它。请出示相应的代码。另外,请说明
m.FullName的实现。fi是什么类型的?更多:FindRows返回所有匹配的行。您在此结果上的foreach循环不会进行任何搜索。与此相反,LINQ 使用延迟执行并将在您的foreach循环内执行搜索。要正确比较运行时,您需要将 LINQforeach与调用FindRows+foreach循环的持续时间进行比较。 -
这似乎不对。 ManifestEntry.FullName 在做什么?它是从文件加载的吗?
-
我认为您首先运行 linq 查询然后运行数据 grideview 查询,在这一步中,所有文件都已加载,因此数据网格可以快速运行,但如果您反转执行路径,您将得到另一个结果。
-
嗨,丹尼尔,卡梅伦; m.FullName 只是对象中的一个字符串:
public string FullName { get; set; }。主循环foreach (FileInfo fi in Files)围绕此匹配代码,因此 linq 查询或 FindRows 处于相同条件。
标签: performance linq poco