当我用另一个类似的函数替换函数调用时,节点 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 毫秒? 这个时间尺度可能会因机器而异,但是当 运行 在同一台机器上时,在两种情况下肯定会有显着的时间差异!

longTsk3longTsk代码没有区别。

这里的关键是调用了same function
当调用相同的函数时,the time cost is reduced.

实际操作所花费的时间,可以准确测算如下。

  1. 如果单独完成,则需要相同的时间。
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
} 
  1. 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
}
  1. 即使连续调用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
} 

换句话说,你的问题可以看出调用相同函数时成本降低了。