I / O操作眼中的多线程?

时间:2012-06-29 21:22:26

标签: c# .net multithreading

我在想......

在I / O操作中使用c#进行多线程处理(假设从c :\1\复制许多文件到c:\2\)会有性能差异而不是执行操作 - 顺序吗?

我与自己斗争的原因是最终的IO操作 - 是一个必须做的工作。所以,即使我并行工作 - 他仍然会按顺序执行这些复制命令......

或者我的假设是错的?

在这种情况下,使用多线程副本有什么好处:

  • 复制许多小文件(总和4GB)
  • 复制4个大文件(总计4 gb,每个1000 mb)

感谢

3 个答案:

答案 0 :(得分:3)

与其他人一样,必须根据具体的应用环境进行衡量。

但是我想引起人们的注意。 每次复制文件时,都会检查对目标位置的写访问权限,这很慢。

当我们必须复制/粘贴一系列已经压缩的文件时,我们都遇到了一个案例,如果你再次压缩成一个大的 ZIP 文件,那么总的压缩大小并不显着小于所有内容的总和,IO操作将以更快的方式执行。 (试试吧,你会看到一个巨大的差异,如果你之前没有这样做的话)。

所以我假设(再次必须在具体系统上进行测量,我只是猜测)在一个磁盘上写一个大文件,将会更快的很多小文件。

希望这有帮助。

答案 1 :(得分:3)

对文件进行多线程处理并不是关于CPU而是关于IO。这意味着适用完全不同的规则。不同的设备具有不同的特征:

  1. 像顺序IO的磁盘
  2. SSD,如顺序或并行随机IO(我的有4个硬件“线程”)
  3. 网络喜欢许多并行操作来分摊延迟

答案 2 :(得分:2)

我不是硬盘相关问题的专家,但也许这会为你带来一些亮点:

Windows正在使用NTFS文件系统。这个系统不会“喜欢”太多小文件,例如1kb文件下。它将“神奇地”制作100个1kb重量400kb而不是100kb的文件。处理很多“小”文件时,它也非常慢。因此,复制一个大文件而不是相同重量的许多小文件会快得多。

另外,根据我的个人经验和知识,多线程不会加速复制许多文件,因为实际的硬件磁盘就像一个单元一样,并且不能通过同时发送许多请求加速(它将逐个处理它们。)