使用fs.readFile读取两个文件比使用fs.readFileSync更快吗?

时间:2015-04-14 12:39:23

标签: node.js

this video的5:40,他说非阻塞版本(使用fs.readFile而不是fs.readFileSync)正在以并行方式读取文件,因此速度更快。如果Node.js是单线程的,那该怎么办?

封闭:

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);

哪一个最快,视频是否正确?

1 个答案:

答案 0 :(得分:2)

这个简单的例子是否可以通过选择一个而不是另一个来获得性能方面的任何优势,这是值得怀疑的。主要区别在于fs.readFileSync将立即读取文件的内容,仅在完成后才恢复到下一条指令。另一方面,异步fs.readFile将向系统发出读取过程并监听传入数据而不会阻塞。

异步版本确实可以并行读取这两个文件,但在后台这通常涉及通常无法同时执行的文件I / O操作。它的速度有多快还取决于文件系统实现和底层硬件设备。如果I / O设备速度很快并且可以执行并发文件读取,那么Node.js肯定会利用其非阻塞方法来利用它。使用不常见的多个线程无济于事,因为IO设备是瓶颈。如果文件非常大,非阻塞和阻塞方法可能需要相似的时间才能完成。

在实践中,最好使用非阻止版本,因为它允许应用程序使用CPU时间并使用其他设备,而无需等待文件完全读取。这通常对服务器应用程序至关重要,即使在执行其他I / O密集型任务时也应接受客户端连接。实际上,this question也可能是有意义的,它会考虑readFileSync看起来更快的情况,尽管在给定的上下文中仍然不推荐。