2014-10-18 83 views

回答

4

那麼你會做什麼,會是大致是這樣的:

  1. 獲取該文件的長度,
  2. 除以N.
  3. 創建N個線程
  4. 各有一個跳到(file_size/N) * thread_no和讀(file_size/N)字節到緩衝區
  5. 等待所有線程合作mplete。
  6. 將緩衝區縫合在一起。

(如果你稍微聰明的話,你可能會避免最後一步......)

然而,值得懷疑的是,你會做這樣得到太多的加速。事實上,如果你在很多情況下減速,我不會感到驚訝。對於典型的操作系統,我希望通過使用來自一個線程的一個大的read(...)調用來讀取文件,您可以獲得一樣好的性能,如果不是更好的性能。

如果順序讀取數據,操作系統可以更快地從光盤讀取數據。事實上,許多操作系統針對這種使用情況進行了優化,並使用預讀和內存緩衝(使用OS級緩衝區)來提供高效的文件讀取速率。

使用多個線程讀取文件意味着每個線程通常會從文件中的不同位置讀取數據。天真地說,這將需要操作系統在不同位置之間向後和向前尋找磁盤磁頭......這將顯着減慢I/O速度。實際上,操作系統會做各種事情來緩解這種情況,但即便如此,同時從磁盤上的不同位置讀取數據仍然不利於I/O吞吐量。