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
相关产品推荐
相关产品推荐

