多线程文件比较性能

时间:2011-12-12 05:32:05

标签: performance c#-4.0 file-io

我只是偶然发现this问题,并想知道如果有以下情况会有任何改善:

  1. 文件以不大于硬盘扇区大小(1 / 2KB,2KB或4KB)的块进行比较
  2. 并且比较是多线程的(或者甚至是.NET 4并行的东西)
  3. 我想有2个线程:一个从文件的开头读取,另一个从末尾读取,直到它们在中间相遇。

    我理解在这种情况下磁盘IO将是最慢的部分,但如果读取永远不必跨越扇区边界(在我扭曲的想象中以某种方式消除任何可能的碎片开销),那么它可能潜在地减少磁头移动因此导致在更好的表现(也许?)。

    当然,其他因素也可以发挥作用,例如,单个与多个处理器/核心或SSD与非SSD,但除此之外;磁盘IO速度+潜在共享处理器时间难以逾越?或许我的计算机理论概念完全偏离基础......

1 个答案:

答案 0 :(得分:4)

如果您正在比较同一驱动器上的两个文件,那么您可以从多线程获得的唯一好处是让一个线程读取 - 填充下一个缓冲区 - 而另一个线程正在比较之前读取的缓冲器。

如果您要比较的文件位于不同的物理驱动器上,那么您可以同时进行两次异步读取 - 每个驱动器一次。

但是你的想法是从头开始读一个帖子而从头开始读另一个会让事情变慢,因为寻找时间会杀了你。磁盘驱动器磁头将不断寻求从文件的一端到另一端。可以这样想:你认为从一开始就按顺序读取文件会更快,或者从前面读取64K会更快,然后从末尾读取64K,然后再回到文件的开头阅读下一个64K等?

碎片是一个问题,当然,但是过多的碎片是例外,而不是规则。大多数文件将进行未分段,或仅部分分段。从文件的任何一端交替读取就像读取病态碎片的文件一样。

请记住,典型的磁盘驱动器一次只能满足一个I / O请求。

进行单扇区读取可能会减慢速度。在我对.NET I / O速度的测试中,一次读取32K比一次读取4K要快得多(在10%到20%之间)。我记得(自从我这么做以来已经有一段时间了),在我的机器上,顺序读取的最佳缓冲区大小为256K。根据处理器速度,磁盘控制器,硬盘驱动器和操作系统版本,每台机器无疑会有所不同。