likes
comments
collection
share

如何在 JavaScript 中快速读取文件

作者站长头像
站长
· 阅读数 25

如何在 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.promises2400 毫秒110 毫秒
fs.readFile 和 util.promisify1500 毫秒180 毫秒
fs.readFileSync140 毫秒140 毫秒
await fs.readFileSync220 毫秒180 毫秒
fs.readFile760 毫秒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
评论
请登录