当我用另一个类似的函数替换函数调用时,节点 js 异步函数花费更多时间
nodejs aync function taking more time when I replace function call with another function which is similar
有人可以向我解释为什么当我 运行 下面的代码时需要的时间更少:
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
}
换句话说,你的问题可以看出调用相同函数时成本降低了。
有人可以向我解释为什么当我 运行 下面的代码时需要的时间更少:
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
}
换句话说,你的问题可以看出调用相同函数时成本降低了。