我想计算异步函数 ( async
/ await
) 在 JavaScript 中的运行时间。
可以这样做:
const asyncFunc = async function () {};
const before = Date.now();
asyncFunc().then(() => {
const after = Date.now();
console.log(after - before);
});
但是,这不起作用,因为承诺回调在新的微任务中运行。即在 --- 的结尾和 asyncFunc()
then(() => {})
开头之间,任何已经排队的微任务将首先被触发,并且它们的执行时间将被考虑在内。
例如:
const asyncFunc = async function () {};
const slowSyncFunc = function () {
for (let i = 1; i < 10 ** 9; i++) {}
};
process.nextTick(slowSyncFunc);
const before = Date.now();
asyncFunc().then(() => {
const after = Date.now();
console.log(after - before);
});
这打印 1739
在我的机器上,即几乎 2 秒,因为它等待 slowSyncFunc()
完成,这是错误的。
请注意,我不想修改 asyncFunc
的主体,因为我需要检测许多异步函数,而无需修改每个函数。否则,我可以在 --- 的开头和结尾添加一个 Date.now()
asyncFunc
。
另请注意,问题不在于如何检索性能计数器。 Using Date.now()
, console.time()
, process.hrtime()
(Node.js only) or performance
(browser only) will not change the base of this problem .问题在于 promise 回调是在新的微任务中运行的。如果您将 setTimeout
或 process.nextTick
之类的语句添加到原始示例中,则您正在修改问题。
原文由 ehmicky 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,没有办法解决这个问题。如果您不想让其他任务有助于您的测量,请不要排队。这是唯一的解决办法。
这不是 promises(或
async function
s)或具体的微任务队列的问题,这是 所有 在任务队列上运行回调的异步事物共有的问题。