首页 > 解决方案 > 当我用另一个类似的函数替换函数调用时,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 然后 longTsk

为什么用另一个类似的函数(longTsk3)替换第二个函数调用需要 500 毫秒以上?这个时间尺度可能会因机器而异,但是在同一台机器上运行的两种情况下肯定会有很大的时间差异!

标签: javascriptnode.jsasynchronousasync-awaitsetimmediate

解决方案


longTsk3和之间的代码没有区别longTsk

这里的关键是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
} 

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


推荐阅读