如果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()发布于 2017-06-27 03:50:40
如果您很难对它们进行并行测试,我建议采用以下方法:
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))
发布于 2017-06-27 03:39:03
如果您只是试图让您的console.time()和console.end()调用围绕您的异步函数工作,那么您可以在每次调用console.time()和console.end()时生成一个唯一的标签,以便当多个调用同时运行时(因为每个调用都将使用自己的标签),度量仍然有效:
let wrapperCntr = 0;
async function wrapper () {
let cnt = wrapperCntr++;
console.time('wrapper' + cnt);
const response = await doWork();
console.timeEnd('wrapper' + cnt);
return response;
}发布于 2019-09-20 02:49:45
https://stackoverflow.com/questions/44771876
复制相似问题