学会如何在 JavaScript 中快速读取文件

假设您需要使用 JavaScript 在服务器上读取多个文件。Node.js 这样的运行时环境中有许多读取文件的方法。哪一种最好?让我们来考虑各种方法。

使用 fs.promises

1const fs = require('fs/promises'); 2const readFile = fs.readFile; 3readFile("lipsum.txt", { encoding: 'utf-8' }) 4.then((data) => {...}) 5.catch((err) => {...})

使用 fs.readFile 和 util.promisify

1const fs = require('fs'); 2const util = require('util'); 3const readFile = util.promisify(fs.readFile); 4readFile("lipsum.txt", { encoding: 'utf-8' }) 5.then((data) => {...}) 6.catch((err) => {...})

使用 fs.readFileSync

1const fs = require('fs'); 2const readFileSync = fs.readFileSync; 3var data = readFileSync("lipsum.txt", { encoding: 'utf-8' })

使用 await fs.readFileSync

1const fs = require('fs'); 2const readFileSync = fs.readFileSync; 3async function f(name, options) { 4 return readFileSync(name, options); 5}

使用 fs.readFile

1const fs = require('fs'); 2const readFile = fs.readFile; 3fs.readFile('lipsum.txt', function read(err, data) {...});

性能测试

我写了一个小的 性能测试重复从磁盘读取一个文件。这是一个简单的循环,每次访问同一个文件。我报告读取文件 50,000 次需要的毫秒数。文件相对较小(略超过一千字节)。我使用装有数十个 Ice Lake Intel 核心和大量内存的大型服务器。我使用的是 Node.js 20.1 和 Bun 1.0.14。Bun 是一个竞争的 JavaScript 运行时

我多次运行了基准测试,并在所有情况下报告最好的结果。您的结果可能会有所不同。

Node.js时间Bun时间
fs.promises2400 ms110 ms
fs.readFile 和 util.promisify1500 ms180 ms
fs.readFileSync140 ms140 ms
await fs.readFileSync220 ms180 ms
fs.readFile760 ms90 ms

至少在我的系统上,在这个测试中,使用 Node.js 的 fs.promises 明显比其他任何方法的成本更高。Bun 运行时在这个测试中比 Node.js 快得多。

对于fs.promises,结果比看起来更糟的是以下这个意义。我发现readFileSync使用了 300 ms 的 CPU 时间,而fs.promises则使用了 7 秒的 CPU 时间。这是因为在基准测试期间,fs.promises触发了多个核心的工作。

将文件大小增加到例如 32kB,并不改变结论。如果使用显著更大的文件,许多 Node.js 情况会因为“堆限制分配失败”而出错。Bun 即使在大文件中也能继续运行。使用 Bun 的测试结果不改变结论:我的测试表明即使对于大文件,fs.readFile 也始终更快。

致谢。我的基准测试灵感来源于 Evgenii Stulnikov 提供的一个测试案例。

点赞
收藏

评论区

加载中...

相关推荐

java读取properties文件总结

一、java读取properties文件总结在java项目中,操作properties文件是经常要做的,因为很多的配置信息都会写在properties文件中,这里主要是总结使用getResourceAsStream方法和InputStream流去读取properties文件,使用getRe

读取csv文件编码的方法

withopen(fpath,'rb')asf:resultchardet.detect(f.read())eresult'encoding'print(e)

mysql高效导入导出load data [infile][outfile]用法

一、MySQL高效导入数据的方法loaddatainfileloaddatainfile语句从一个文本文件中以很高的速度读入一个表中。使用这个命令之前,mysqld进程(服务)必须已经在运行。由于安全原因,当读取位于服务器上的文件时,文件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用loaddatainfile,在服

Java基础学习总结(15)——java读取properties文件总结

一、java读取properties文件总结  在java项目中,操作properties文件是经常要做的,因为很多的配置信息都会写在properties文件中,这里主要是总结使用getResourceAsStream方法和InputStream流去读取properties文件,使用get

Java 读取Properties文件时应注意的路径问题

1\.使用Class的getResourceAsStream()方法读取Properties文件(资源文件)的路径问题:      InputStreaminthis.getClass().getResourceAsStream("资源Name");    注意:    (1)这种方式要求Properties资源文件必须与当

Node.js 读本地文件和发起 POST 网络请求

最近需要使用Nodejs读取本地文件中的数据构造请求去批量请求CGI获取数据,这样就不用手工搬砖了。因为需要携带Cookie,故使用POST方法。代码//读取本地文件varfsrequire("fs");varreadlinerequire('readline');