【发布时间】:2019-12-16 06:07:06
【问题描述】:
我创建了一些使用异步和同步事件处理程序的测试。我得出的结论是,使用异步处理程序可以极大地改进我们的代码。
下面两个sn-ps的唯一区别是,在一个sn-ps中,customEventHandler是async,而在那个处理程序中,它使用await sleep(customEventHandlerSleepTime);而不是sleep(customEventHandlerSleepTime);:
- 异步测试:
<body>
<div id="event1">
<div id="event2">
<div id="event3">
<div id="event4"></div>
</div>
</div>
</div>
</body>
<script>
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const customEventHandlerIterationsCount = 1000000;
const customEventHandlerSleepTime = 500;
const customEventName = 'customevent';
const customEvent = new Event('customevent');
const customEventHandler = async() => {
for (let i = 0; i < customEventHandlerIterationsCount; ++i) {
await sleep(customEventHandlerSleepTime);
}
};
document.getElementById('event4').addEventListener(customEventName, customEventHandler);
document.getElementById('event3').addEventListener(customEventName, customEventHandler);
document.getElementById('event2').addEventListener(customEventName, customEventHandler);
document.getElementById('event1').addEventListener(customEventName, customEventHandler);
(() => {
const start = new Date().getTime();
document.getElementById('event4').dispatchEvent(customEvent);
const end = new Date().getTime();
console.log('Time: ', (end - start));
})();
</script>
- 同步测试:
<body>
<div id="event1">
<div id="event2">
<div id="event3">
<div id="event4"></div>
</div>
</div>
</div>
</body>
<script>
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const customEventHandlerIterationsCount = 1000000;
const customEventHandlerSleepTime = 500;
const customEventName = 'customevent';
const customEvent = new Event('customevent');
const customEventHandler = () => {
for (let i = 0; i < customEventHandlerIterationsCount; ++i) {
sleep(customEventHandlerSleepTime).then(() => {});
}
};
document.getElementById('event4').addEventListener(customEventName, customEventHandler);
document.getElementById('event3').addEventListener(customEventName, customEventHandler);
document.getElementById('event2').addEventListener(customEventName, customEventHandler);
document.getElementById('event1').addEventListener(customEventName, customEventHandler);
(() => {
const start = new Date().getTime();
document.getElementById('event4').dispatchEvent(customEvent);
const end = new Date().getTime();
console.log('Time: ', (end - start));
})();
</script>
以上测试的结果是:
- 异步测试执行时间:~1ms
- 同步测试执行时间:~1500ms
我做错了什么还是真的?如果我们从 sleep 函数中删除“await”和“.then()”,同步处理程序会以最小的时间差异更快地打印“Time”消息。
基于这个测试,我想知道是否总是(或几乎总是)使用异步处理程序更好,如果我们例如不知道这个处理程序的嵌套函数会发生什么,或者如果我们不直接在处理程序中使用“等待”,最好避免使用异步?也许有更好的方法来测试这个?
【问题讨论】:
标签: javascript performance async-await event-handling dom-events