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

时间:2017-06-27 03:36:08

标签: node.js testing asynchronous promise performance-testing

如果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()

3 个答案:

答案 0 :(得分:1)

如果您只是尝试让console.time()console.end()来电解决异步功能,则每次拨打console.time()时都可以生成唯一标签{ {1}}以便当同时有多个航班呼叫时,测量仍然有效(因为每个呼叫将使用自己的标签):

console.end()

答案 1 :(得分:1)

如果您在并行测试它们时遇到困难,我推荐这种方法:



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是单线程的。您在同一个tick中初始化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))




答案 2 :(得分:1)

Related Question

为什么不使用内置的performance包,默认情况下,该包在node和浏览器中可用。

以下内容也适用于多个通话...

async function timePromise(promiseFunction) {
  try {
    const begin = performance.now();
    await promiseFunction();
    const end = performance.now();
    const timeTaken_ms = end - begin;
    return timeTaken_ms;
  } catch (error) {
    console.error(error);
  }
}
相关问题