javascript - 当我用另一个类似的函数替换函数调用时,nodejs aync 函数需要更多时间
问题描述
有人可以向我解释为什么当我运行以下代码时所需的时间更少:
for2=longTsk() -- approx 2500ms every time
并且对于
for2=longTsk3() -- approx 3000ms every time
这两个函数中的普通 for 循环每次都需要大约 1500 毫秒
function longTsk() {
return new Promise((resolve) => {
setImmediate(() => {
for (let i = 0; i < 2019000000; i++) {
}
console.log('HOILA');
resolve()
});
});
}
function longTsk3() {
return new Promise((resolve) => {
setImmediate(() => {
for (let j = 0; j < 2019000000; j++) {
}
console.log('HOILA');
resolve()
});
});
}
const date = Date.now()
async function doForAll() {
const for1 = longTsk()
const for2 = longTsk() //when i change this to longtsk3 exact double time is required
await Promise.all([for1, for2])
console.log(Date.now() - date);
}
doForAll()
console.log('sldkfgj');
console.log('lskdjglkjdfg');
我第一次跑,longTsk3
然后longTsk
在这个屏幕截图中
为什么用另一个类似的函数(longTsk3)替换第二个函数调用需要 500 毫秒以上?这个时间尺度可能会因机器而异,但是在同一台机器上运行的两种情况下肯定会有很大的时间差异!
解决方案
longTsk3
和之间的代码没有区别longTsk
。
这里的关键是same function
被调用。
并且当调用相同的函数时,the time cost is reduced
.
实际操作所花费的时间可以如下准确测量。
- 如果单独完成,则需要相同的时间。
async function doForAll() {
const for1 = longTsk()
const for2 = longTsk3()
var date = Date.now()
await Promise.all([for1])
console.log(Date.now() - date); // 1784
date = Date.now()
await Promise.all([for2])
console.log(Date.now() - date); // 1789
}
- 在 的情况下
longTsk & longTsk
,由于它已经被执行,所以下次调用它时成本似乎会降低。
async function doForAll() {
const for1 = longTsk()
const for2 = longTsk()
var date = Date.now()
await Promise.all([for1])
console.log(Date.now() - date); // 1789
date = Date.now()
await Promise.all([for2])
console.log(Date.now() - date); // 1183
}
- 即使
longTsk3
连续调用两次,也可以获得与上面完全相同的结果。
async function doForAll() {
const for1 = longTsk3()
const for2 = longTsk3()
var date = Date.now()
await Promise.all([for1])
console.log(Date.now() - date); // 1784
date = Date.now()
await Promise.all([for2])
console.log(Date.now() - date); // 1185
}
换句话说,你的问题可以看出,调用相同的函数时,成本降低了。
推荐阅读
- charts - 如何将变量传递给 .setOption
- flash - Adobe flash AS 2.0 真假
- javascript - 获取引导网格中列的宽度
- azure-service-fabric - 我可以将节点添加到 Service Fabric 中的 1 节点群集吗?
- reactjs - 更新第三方对象的状态
- node.js - Nodejs 和 Reactjs 如何集成?
- javascript - 如何在 JavaScript 中转换货币?
- javascript - 为 Javascript 编码/解码 JSON 对象
- node.js - React 安全性:状态操作
- c# - 如何检索 AWS Rekognition 返回的原始 Json?