2011-12-12 55 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

感謝您的澄清。 –