写点什么

快速入门:使用 JavaScript 读取文件的最佳实践

作者:Apifox
  • 2024-05-31
    广东
  • 本文字数:1025 字

    阅读完需:约 3 分钟

快速入门:使用 JavaScript 读取文件的最佳实践

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


使用 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;async function 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 次需要的毫秒数。文件相对较小(略超过一千字节)。我使用装有数十个 Ice Lake Intel 核心和大量内存的大型服务器。我使用的是 Node.js 20.1 和 Bun 1.0.14。Bun 是一个竞争的 JavaScript 运行时


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



至少在我的系统上,在这个测试中,使用 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 提供的一个测试案例。


  • 源自:https://lemire.me/blog/2024/03/12/how-to-read-files-quickly-in-javascript/

用户头像

Apifox

关注

Apifox 2022-05-17 加入

Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化平台。Apifox = Postman + Swagger + Mock + JMeter

评论

发布
暂无评论
快速入门:使用 JavaScript 读取文件的最佳实践_JavaScript_Apifox_InfoQ写作社区