2015-04-14 34 views
0

5:40在this video他說非阻塞版本(使用fs.readFile而不是fs.readFileSync)是在並行讀取文件,因此速度更快。如果Node.js是單線程的話,這怎麼可能呢?用fs.readFile比使用fs.readFileSync更快地讀取兩個文件?

阻塞:

var callback = function(err, contents) { 
    console.log(contents); 
} 

fs.readFile('/etc/hosts', callback); 
fs.readFile('/etc/inetcfg', callback); 

非阻塞:

var callback = function(err, contents) { 
    console.log(contents); 
} 

fs.readFileSync('/etc/hosts', callback); 
fs.readFileSync('/etc/inetcfg', callback); 

哪一個是最快的,也是視頻是否正確?

+0

多線程與CPU調度有關,但讀取文件與I/O調度有關,這是Node非常擅長的。 – robertklep

回答

2

這個簡單的例子通過選擇一個而不是另一個可以在性能方面獲得任何優勢是值得懷疑的。主要區別在於fs.readFileSync將立即讀取文件的內容,只有在完成後才恢復到下一條指令。另一方面,異步fs.readFile將向系統發出讀取過程,並在不阻塞的情況下監聽傳入數據。

確實,異步版本可能會同時讀取兩個文件,但在後臺這總是涉及通常不能同時執行的文件I/O操作。它能多快取決於文件系統的實現和底層硬件設備。如果I/O設備速度很快並且可以執行併發文件讀取,那麼Node.js肯定會利用它的非阻塞方法。使用多線程(不太常見)不會有幫助,因爲IO設備是瓶頸。如果文件非常大,則非阻塞和阻止方法可能需要相似的時間才能完成。

然而,在實踐中,最好使用非阻塞版本,因爲它允許應用程序使用CPU時間並關注其他設備而無需等待文件被完全讀取。這對於服務器應用程序來說通常很重要,即使在執行其他I/O密集型任務時也應該接受客戶端連接。實際上,this question也可能是有意義的,它認爲readFileSync似乎更快,儘管在給定的上下文中仍然不推薦。

+0

OTOH,如果有足夠的I/O速度可用,非阻塞(併發)文件讀取將比阻塞(連續)讀取快得多。 – robertklep

+0

@robertklep當然,但視頻誇大了它可以獲得的速度,因爲它取決於底層硬件。一個普通的硬盤驅動器不能同時讀取多個磁盤位置,例如,會有一個讀取時間開銷。 –

+0

現在不是每個人都在使用SSD嗎? ;-) – robertklep

相關問題