我读过大多数时候我不应该像arr.find(function (p) { return p.id === this.id; }, daniel);
这样的多线程用于I / O绑定任务。
我用15.000 xml文件进行了简单的XPath搜索测试。经过测试的Parallel.ForEach
是一个简单的XPath
,可在15.000个文件的1333中找到。
我做了一个简单的foreach:
'//element'
和一个简单的foreach (var file in files)
{
XPathDocument xDoc = null;
using (XmlReader xr = XmlReader.Create(file, xrSettings))
xDoc = new XPathDocument(xr);
XPathNavigator xNav = xDoc.CreateNavigator();
xNav = xNav.SelectSingleNode(xpath);
if (xNav != null)
results.Add(Path.GetFileName(file));
}
:
Parallel.ForEach
我使用相同的数据测试了两个版本3次以考虑文件系统缓存:
foreach:39,6秒
Parallel.ForEach:7,34秒
当Parallel.ForEach(files, file =>
{
XPathDocument xDoc = null;
using (XmlReader xr = XmlReader.Create(file, xrSettings))
xDoc = new XPathDocument(xr);
XPathNavigator xNav = xDoc.CreateNavigator();
xNav = xNav.SelectSingleNode(xpath);
if (xNav != null)
results.Add(Path.GetFileName(file));
});
速度快得多时,为什么我应该使用foreach执行此任务?或者这只是CPU绑定和从磁盘读取xml文件