async和Parallel.ForEach对IO操作的潜在好处

时间:2011-11-14 20:15:31

标签: c# multithreading asynchronous task-parallel-library

我正在开发和维护.NET 3.5工具,并且想知道使用.NET 4的新TPL甚至是仍在CTP中的新异步功能是否可以获得性能的潜在提升。

该工具的工作大致可以描述为:

  1. 检索容器文件列表(当前.MSI文件) - 几十个,~50-70
  2. 遍历每个文件,并构造一个表示它的运行时对象。
  3. 对于创建的每个运行时对象,对其内容执行一些查询(将其内容与系统上的某些文件进行比较)。
  4. 项目#2和#3是冗长的,我想通过使用Parallel.ForEach或其他方法执行此操作来获得关于改善执行时间(现在是几分钟)的潜力的一些意见并行工作。

    我预见到的潜在改进是:

    使用多个CPU /核心 正在进行IO操作(如读取文件)以保持应用程序正常运行。

    在开始开发之前,您是否认为此类应用程序可以从中受益?

3 个答案:

答案 0 :(得分:3)

使用TPL可以获得一些改进,现在可以在.NET 4中使用。

所有这三个步骤都可能设计为并行运行。

话虽如此,鉴于上述情况,很难知道你会看到多少改进。主要问题是繁重的文件I / O.即使您利用多个内核,磁盘I / O也可能成为瓶颈,并且尝试并行运行可能会减慢代码的这些部分。

如果你在查询/计算方面做了大量的IO,那么仅仅通过并行运行例程就不会获得非常大的性能优势。

答案 1 :(得分:3)

我会运行一个分析器来查看您的应用程序花费时间然后再决定。如果您发现它正在等待I / O完成,那么您可能会从使用Asynchronous Programming Model中受益。如果您发现自己是计算绑定的,那么,根据您预期的运行时环境(多核/单核),您可能会发现多线程计算是有益的。当然,您可能会发现两种情况都适用。

顺便说一句,您还可以使用Reactive Extensions在.NET 3.5中使用许多.NET 4线程功能。我目前正在一个高效的.NET 3.5应用程序中使用它。

答案 2 :(得分:1)

  

在开始开发之前,您是否认为此类应用程序可以从中受益?

不是很多。您描述了一个3阶段系统,其中每个阶段都受到严格的I / O限制。

我假设你只有1个磁盘,这意味着并行运行甚至可以减慢速度(更多Seek操作)。

另一方面,阶段2)和3)可能是CPU密集型,足以看到一些改进。

你必须像往常一样进行衡量。