异步和并行的潜在好处.ForEach用于IO操作

本文关键字:ForEach 用于 IO 操作 并行 异步 | 更新日期: 2023-09-27 18:14:27

我正在工作中开发和维护一个。net 3.5工具,想知道是否可以通过使用。net 4的新TPL甚至是CTP中的新异步特性来获得潜在的性能提升。

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

  1. 检索容器文件列表(目前是.MSI文件)——几十个,~ 50-70
  2. 遍历每个文件,并构造一个表示它的运行时对象。
  3. 对于创建的每个运行时对象,对其内容执行一些查询(将其内容与系统上的一些文件进行比较)。

项目#2和#3是冗长的,我想得到一些关于使用Parallel改进执行时间(现在是几分钟)的潜力的意见。ForEach或其他方法并行执行此工作。

我预见到的潜在改进是:

使用多个cpu/内核当IO操作(如读取文件)正在执行其他操作时,保持应用程序运行

在进入开发阶段之前,您认为这类应用程序可以从中受益吗?

异步和并行的潜在好处.ForEach用于IO操作

通过使用。net 4中提供的TPL,这肯定会得到一些改进。

这三个步骤可以被设计成并行运行。

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

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

我会运行一个分析器,看看您的应用程序在哪里花费了时间,然后做出决定。如果您发现它正在等待I/O完成,那么您可能会发现使用异步编程模型的好处。如果您发现自己受到计算限制,那么根据您预期的运行时环境(多核/单核),您可能会发现多线程计算更有好处。当然,你可能会发现两种情况都适用。

顺便说一句,通过使用响应式扩展,你还可以在。net 3.5中使用许多。net 4的线程特性。我目前正在一个生产性的。net 3.5应用程序中使用它。

在进入开发阶段之前,您认为这类应用程序可以从中受益吗?

不是很多。你描述了一个三级系统,其中每一级都有严重的I/O限制。

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

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

像往常一样,你必须测量。