如何在 JavaScript 中快速读取文件
如何在 JavaScript 中快速读取文件
假设您需要使用 JavaScript 读取服务器上的多个文件。使用 Node.js 等运行时,有很多方法可以读取 JavaScript 中的文件。哪一种方法最好?让我们考虑一下各种方法。
使用 fs.promises
const fs = require ('
fs / promises ' );
const readFile = fs.readFile ; readFile (“ lipsum.txt ” ,{ encoding :' utf - 8 ' } )。 then (( data )= > { 。。。} )。catch (( err )= > { 。。。。} )
使用 fs.readFile 和 util.promisify
const fs = require ( ' fs ' ) ;
const util = require ( ' util ' ) ;
const readFile = util.promisify ( fs.readFile ) ;
readFile ( " lipsum.txt " ,{ encoding : ' utf - 8 ' } ) 。 then ( ( data ) = > { . . . } ) 。catch ( ( err ) = > { . . . } )
使用 fs.readFileSync
const fs = require ( ' fs ' ) ;
const readFileSync = fs . readFileSync ;
var data = readFileSync ( " lipsum.txt " , { encoding : ' utf-8 ' } )
使用 await fs.readFileSync
const fs = require ( ' fs ' ) ;
const readFileSync = fs . readFileSync ;
异步函数f ( name , options ) {
return readFileSync ( name , options ) ;
}
使用 fs.readFile
const fs = require ( ' fs ' ) ;
const readFile = fs.readFile ;
fs.readFile ( ' lipsum.txt ' , function read ( err , data ) { ... } ) ;
基准
我编写了一个小型基准测试,其中我重复从磁盘读取文件。这是一个简单的循环,每次访问同一个文件。我报告了读取文件 50,000 次所需的毫秒数。该文件相对较小(略大于 1 千字节)。我使用一台大型服务器,该服务器有数十个 Ice Lake Intel 核心和大量内存。我使用 Node.js 20.1 和 Bun 1.0.14。Bun是一个竞争的 JavaScript 运行时。
我多次运行基准测试,并报告了所有情况下的最佳结果。您的结果可能会有所不同。
时间(Node.js) | 时间(Bun) | |
---|---|---|
fs.promises | 2400 毫秒 | 110 毫秒 |
fs.readFile 和 util.promisify | 1500 毫秒 | 180 毫秒 |
fs.readFileSync | 140 毫秒 | 140 毫秒 |
await fs.readFileSync | 220 毫秒 | 180 毫秒 |
fs.readFile | 760 毫秒 | 90 毫秒 |
至少在我的系统上,在本次测试中,使用 Node.js 时,fs.promises 比其他任何东西都要昂贵得多。在本次测试中,Bun 运行时比 Node.js 快得多。
fs.promises
的结果比表面上看起来的更糟糕,具体表现在以下方面。我发现readFileSync
占用了 300 毫秒的 CPU 时间,而fs.promises
占用了 7 秒的 CPU 时间。这是因为fs.promises
触发器在基准测试期间在多个核心上工作。
文件大小增加到 32kB 不会改变结论。如果文件大得多,许多 Node.js 案例会失败,并显示“堆限制分配失败”。Bun 即使在处理大文件时也能继续运行。测试结果不会改变 Bun 的结论:在我的测试中,fs.readFile 始终更快,即使对于大文件也是如此。
转载自:https://juejin.cn/post/7375004154882162703