使用多線程會加快文件讀取速度嗎?

前幾天遇到一個頗有意思的問題,提煉出來就是使用多線程去讀取文件的話會加快讀取速度嗎?程序員

在往下看以前先本身想想,一樣若是在面試中問你這個問題該怎麼回答呢?面試

假設有一個文件大小爲10G,咱們須要將其讀取到內存中(假設內存能容納下該文件),那麼使用多個線程分塊去讀取的話會加快讀取速度嗎,好比咱們建立兩個線程,一個線程讀取前5G數據;另外一個線程讀取後5G數據,這會比只是用一個線程將其讀入內存快嗎?微信

先說答案,無論你使用的是什麼語言,C/C++也好,Java、Python也罷,這個和語言無關,使用多個線程去讀取文件一般是一個bad idea多線程

爲何?ide

燒菜是須要時間的性能


爲何使用多個線程去讀取文件一般是一個bad idea呢?idea

緣由就在於雖然咱們可使用多個線程來充分利用多個CPU核心,可是不要忘了,磁盤就只有一個spa

所以簡單的使用多個線程並不能加快文件的讀取速度。這就比如一個餐館,這個餐館中有多個服務員,可是隻有一個廚師;服務員下單很簡單,即一句話的事兒,可是廚師作一道菜出來是須要不少時間的,一個服務員下的單就夠廚師忙的了,多個服務員同時下單並不能提升廚師的產出。.net

在這裏服務員就比如CPU,廚師就比如磁盤。線程

實際上使用多個線程來讀取文件可能會使得狀況更加糟糕,這就涉及到了對磁盤結構的理解。


理解磁盤

固然,這裏的磁盤是指的機械磁盤,這類磁盤須要把磁頭放到正確的磁道上,接着等待相應的扇區轉到該磁頭下才能夠讀取磁盤數據。

所以磁盤中最耗時的其實並非把數據從磁盤讀取到磁頭,最耗時的實際上是把磁頭移動到正確的磁道上,這個步驟最耗時,有的同窗可能會有疑問,爲何這個步驟是最耗時的呢?

不要忘了,咱們說的是機械磁盤,磁頭的移動相對電子的速度是極慢的,使用多個線程來讀取文件的話,磁頭可能要在不一樣的磁道間來回移動以知足各個線程的文件讀取請求,這個過程對磁盤性能的影響是很是大的。

如今你該知道爲何多線程讀取文件不會加快讀取速度了吧。


最佳實踐

理解了磁盤的原理以後咱們就明白了,實際上磁盤的順序讀取才是最快速的,這就是爲何咱們把2G電影copy到磁盤的速度要遠遠快於copy 2G的多個文件的緣由,由於一個電影文件做爲總體可能順序的放在磁盤當中,而多個文件會散落在磁盤的各個角落中。

所以比較好的辦法就是使用一個線程來順序讀取一個大文件,要想加快數據處理速度能夠等文件讀取完成後使用多個線程來處理這些已經加載到內存中的數據。


總結

一個看似簡單的問題其實每每並非咱們想的那麼容易,這涉及到了對磁盤理解,只有對計算機各個系統有了一個透徹的理解後,解決問題才能從關鍵點着手,程序員也只有理解了底層才能設計出高性能程序。

本文分享自微信公衆號 - 碼農的荒島求生(escape-it)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索