首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算异步函数在多个调用中的执行时间

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

Stack Overflow用户
提问于 2017-06-27 03:36:08
回答 3查看 2.6K关注 0票数 3

如果do work函数正在执行某些操作,例如,从队列中选择一个项并执行一些操作。如何获得doWork函数的执行时间?我想知道doWork平均需要多长时间才能完成。

示例代码

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
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()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-27 03:50:40

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

代码语言:javascript
复制
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时间:

代码语言:javascript
复制
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))

票数 1
EN

Stack Overflow用户

发布于 2017-06-27 03:39:03

如果您只是试图让您的console.time()console.end()调用围绕您的异步函数工作,那么您可以在每次调用console.time()console.end()时生成一个唯一的标签,以便当多个调用同时运行时(因为每个调用都将使用自己的标签),度量仍然有效:

代码语言:javascript
复制
let wrapperCntr = 0;

async function wrapper () {
  let cnt = wrapperCntr++;
  console.time('wrapper' + cnt);
  const response = await doWork();
  console.timeEnd('wrapper' + cnt);
  return response;
}
票数 2
EN

Stack Overflow用户

发布于 2019-09-20 02:49:45

相关问题

为什么不使用内置的性能包,它在节点和浏览器中默认可用。

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

代码语言:javascript
复制
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);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44771876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档