对于I / O绑定任务,Parallel.ForEach vs foreach

时间:2016-05-02 04:56:24

标签: c# multithreading foreach parallel.foreach

我读过大多数时候我不应该像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文件

0 个答案:

没有答案