我发现在某些情况下运行异步等待可能会慢得多。
<html>
<script>
function makeAPromise() {
return Promise.resolve(Math.random());
}
function usingPromises() {
const before = window.performance.now();
return makeAPromise().then((num) => {
const after = window.performance.now();
console.log('Total (promises): ', after-before, 'ms');
return num;
})
}
async function usingAwait() {
const before = window.performance.now();
const num = await makeAPromise();
const after = window.performance.now();
console.log('Total (await): ', after-before, 'ms');
return num;
}
function runBoth() {
usingAwait();
usingPromises();
}
runBoth();
</script>
<button onclick="usingPromises()">usingPromises</button>
<button onclick="usingAwait()">usingAwait</button>
<button onclick="runBoth()">both</button>
</html>
国际海事组织,console.log在usingPromises应该打印类似的结果在usingAwait。但在现实中,我得到:
总计(承诺):0.25毫秒 总计(待定):2.065毫秒
此外,在页面加载之后,如果单击“usingPromises”或“usingAwait”按钮,则每个按钮都会得到类似的结果。(单独跑步时两者都是快速的)
总计(承诺):0.060000000026775524毫秒 总计(待定):0.08999999999650754毫秒
但是,如果我点击“两种”按钮,“等待”版本比承诺版本慢3-4倍。
我有一个实际的应用程序运行了大量的承诺/异步-等待初始化函数,我发现将一些异步等待函数替换为“相等”的承诺版本可以节省大量的加载时间(~200 to )。
有人能解释一下为什么吗?异步等待是否也使用与承诺(微任务)相同的作业队列?什么时候应该使用承诺而不是异步等待,有最佳实践吗?
谢谢
发布于 2017-11-11 11:11:41
当使用按钮Both运行时,您的第一个结果是误导的。承诺决议是在微任务事件队列中排序的:因此其中一个可以在另一个队列中使用console.log打印,但是console.log会给第二个任务带来额外的延迟,因为它发生在创建第二个承诺和处理其解析之间。
如果将runBoth定义为:
Promise.resolve().then(usingAwait).then(usingPromises)现在,这两个承诺将在微任务中创建,而第一个承诺将在创建第二个承诺之前得到解决和处理。这将导致一个更公平的比较,在任何时间都不能测量console.log。
https://stackoverflow.com/questions/47237054
复制相似问题