2011-12-12 68 views
0

我只是偶然到this SO问题,想知道是否会有任何性能的提高,如果:多线程文件比较性能

  1. 文件中的块进行比较并不比硬盘扇区大小(1/2KB ,2KB,或4KB)
  2. 和比较做多线程(或者甚至与.NET 4个并行的东西)

我想有是2个线程:一个是从文件的开头读取和另一个从e读取直到他们在中间相遇。

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

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

+2

线程购买更多的CPU周期,而不是更多的磁盘。让线程从磁盘的不同部分读取会使其慢*很多*。整蛊也要测试,当你第二次运行你的程序时它会看起来很快。 –

回答

4

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

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

但是你的想法是从一开始就读一个线程,而从另一个读取结束会让事情变慢,因为寻找时间会杀了你。磁盘驱动器磁头将不断地从文件的一端到另一端进行搜索。您可以这样想:您认为从头开始顺序读取文件会更快一些,还是从前端读取64K会更快,然后从最后读取64K,然后回到文件的开头读下一个64K等?

碎片是一个问题,可以肯定,但过多的碎片是例外,而不是规则。大多数文件将被整理,或者只是部分分割。从文件的任何一端交替读取就像阅读一个病理碎片的文件。

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

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

+0

感谢您的澄清。 –