You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中Promise比Callback读取文件耗时更长的原因咨询

为什么Promise版readFile比Callback版耗时更高?

首先得指出你测试代码里的核心逻辑问题:

  • Callback版本的t2-t1,只算了「调用readFile函数并返回」的时间。因为readFile是异步非阻塞的,函数一调用完就执行了t2 = performance.now(),这时候文件还在后台读呢,回调都没开始跑。你看到的0.19ms只是发起异步请求的开销,根本不是文件读取完成的总耗时。
  • Promise版本用了await,会等readFile的Promise完成后才执行t2 = performance.now(),所以这个4.39ms是从发起请求到文件读完的真实总耗时。

这俩时间统计的完全不是一回事,所以看起来差这么多。

要公平对比真实性能,得改测试逻辑:

  • Callback版本得把时间计算挪到回调里:
import {readFile} from 'fs'
const t1 = performance.now()
readFile('./data.txt','utf-8',(err,data) => {
    if(err) throw err
    console.log(data)
    const t2 = performance.now()
    console.log(t2-t1) // 这里才是真实的读取完成耗时
})
  • Promise版本保持原样就行,因为await已经等操作完成了。

调整后再测,你会发现两者耗时差异会小很多,剩下的细微差距来自Promise本身的额外开销:

  • 要创建Promise实例,涉及对象分配和状态管理
  • 异步完成后,Promise的回调会进微任务队列,而Callback版的回调直接进Node.js的I/O回调队列,调度时机和开销有点不一样
  • node:fs/promises的readFile本质是对回调版的包装,多了一层封装逻辑

不过这些额外开销都是微秒级的,大部分场景下完全可以忽略。

内容的提问来源于stack exchange,提问作者Adnan Arefin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:03:11