c# - Parallel.ForEach 性能不佳

标签 c# .net performance parallel-processing parallel.foreach

我编写了一个小程序,可以将一堆文件转换为 pdf。

该程序执行以下操作:

  • 从文件夹中获取 FileInfo 对象数组(10,000 个文档)
  • 对于每个FileInfo
    • 使用 FileInfo.CopyTo() 创建备份副本,
    • 使用一些 Aspose 库将文档转换为 PDF
    • 转换后,将 PDF 复制到新目标
    • 在 foreach 内部,WinForm UI 会引发并处理一个事件,以显示一些进度

根据文档的大小,文档的转换可能需要 0-3 秒。 我认为这将是 Parallel.ForEach 的完美候选者,因此我修改了程序。

但是,转换花费了 1 个小时,而使用 Parallel.Foreach 则需要 1.5 个小时(我尝试过的服务器有 2 个 Intel Xeon Procs)。

我做错了什么或者我需要考虑什么才能获得更好的性能?

最佳答案

我建议通过查看任务管理器中的 CPU 和资源监视器中的磁盘 I/O 响应时间/队列长度和/或查看各种可用的性能计数器来检查您的操作是否受 CPU 限制或 I/O 限制。

我怀疑您的问题很可能是您现在同时执行多个文件副本(既用于创建备份又用于写入转换后的文件)。与随机访问相比,硬盘的顺序访问(如果一次仅写入/读取一个文件)要快得多。

关于c# - Parallel.ForEach 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249356/

相关文章:

.net - 为什么 UWP 类库项目引用被复制到主项目?

c# - 分析程序性能

iphone - 如何使用 Core Location 计算速度?

c# - .NET WPF 记住 session 之间的窗口大小

c# - Lambda 表达式到 Func<T, TResult>

c# - 通过 Roslyn 添加元数据引用时,将完整路径添加到项目文件中

c# - 在 C# 中发现串行端口

c# - 如何最有效(快速)匹配2个列表?

c# - 获取存储在 hubspot 中的所有表单作为 Dictionary<Guid, object>()

c# - 如何刷新WPF ListView中的ListItem,MVVM中的CollectionViewSource