5

我尝试使用以下两种解决方案复制 200 个文件,但我没有看到差异(我曾经System.Diagnostics.Stopwatch测量时间)。在这两种情况下,都需要 8 秒。第二个(并行)解决方案不应该更快吗?我想因为是 IO 操作使用 Parallel 会加快复制速度。

我错过了什么?

// Case1 - Regular iteration
foreach (FileInfo file in files)
{
    string temppath = Path.Combine(destDirName, file.Name);
    file.CopyTo(temppath, false);
}

// Case2 - Parallel
Parallel.ForEach(files, file =>
{
    string temppath = Path.Combine(destDirName, file.Name);
    file.CopyTo(temppath, false);
});
4

2 回答 2

7

任务的并行执行并不能保证性能改进。

在您的情况下,文件复制可能会受到 IO 限制,而不是 CPU 限制。CPU 通常比 IO 设备有更多的可用带宽(除非您碰巧使用 Fusion IO 卡或其他东西),因此 IO 操作往往会导致 CPU 等待很多。

使用大量 CPU 的任务可以并行完成以获得性能提升。同样等待外部因素的任务也可以从转移到另一个线程中受益,以免成为阻塞任务。

但是,等待相同外部资源的任务可能几乎看不到任何好处,除非该外部资源本身可以处理与多个线程相关的流量(IO 往往永远无法处理流量并且实际上可能导致资源争用,放慢速度)。

于 2012-10-24T09:06:07.237 回答
1

与上面的@Adam 完全相同,但增加了几点:

如果你有机会,你可能想用一个或两个网络驱动器试试这个。高延迟连接上的文件传输具有较大的设置延迟,这很可能为多线程解决方案带来优势,尤其是在处理大量小文件时。

使用具有少量固定线程数(例如 2 个)的池可能也很有用,以查看这是否可以减少磁盘争用并提高性能。

如果您喜欢我的回答,请点赞@Adam,而不是我。

于 2012-10-24T10:00:33.863 回答