计算多个调用中异步函数的执行时间

永久编码器

如果do work功能正在执行某些操作,例如,从队列中选择一个项目并执行某些操作。doWork随着时间的推移,我将如何获得函数的执行时间。我想找出doWork平均需要多少时间才能完成。

样例代码

function doWork () {
  return Promise.resolve({first: 'Tony', last: 'Starks'})
}

async function wrapper () {
  console.time('wrapper')
  const response = await doWork()
  console.timeEnd('wrapper')
  return response
}

Promise.all([
  wrapper(),
  wrapper(),
  wrapper()
]).then((result) => console.info(result))

输出量

wrapper: 0.388ms
[ { first: 'Tony', last: 'Starks' },
  { first: 'Tony', last: 'Starks' },
  { first: 'Tony', last: 'Starks' } ]
(node:2749) Warning: No such label 'wrapper' for console.timeEnd()
(node:2749) Warning: No such label 'wrapper' for console.timeEnd()
帕特里克·罗伯茨

如果您很难并行测试它们,建议您使用以下方法:

function doWork () {
  return Promise.resolve({ first: 'Tony', last: 'Stank' })
}

async function wrapper (index) {
  console.time(index)
  const response = await doWork()
  console.timeEnd(index)
  return response
}

Promise.all(
  Array(3) // some big number
    .fill(wrapper)
    .map((wrapper, index) => wrapper(index))
).then((results) => console.info(results))

但是,JavaScript是单线程的。您正在同一滴答中初始化3个异步函数。它们最终在每个异步回调上争夺CPU时间,正如您所观察到的那样,这会导致不必要的时序延迟。

比较上下时间;下面的速度将提高一个数量级,因为它们是串行初始化的,并且不会争用CPU时间:

function doWork () {
  return Promise.resolve({ first: 'Tony', last: 'Stank' })
}

async function wrapper ({ index, responses }) {
  console.time(index)
  responses.push(await doWork())
  console.timeEnd(index)
  return { index: ++index, responses }
}

Array(3) // some big number
  .fill(wrapper)
  .reduce(
    (promise, wrapper) => promise.then(wrapper),
    Promise.resolve({ index: 0, responses: [] })
  )
  .then(({ responses: results }) => console.info(results))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章