【发布时间】:2019-08-31 08:58:21
【问题描述】:
我将之前使用 async/await 同步到异步代码的 Node.js (v10.13.0) 的 JavaScript 代码重构了。后来我注意到的是程序执行时间慢了约 3 倍的性能下降。
将同步函数调用链转换为异步函数调用时是否会降低性能?
简化示例
更改同步码
function fn1() {
return 1;
}
function fn2() {
return fn1();
}
(function() {
const result = fn2();
});
进入异步代码:
async function fn1() {
return 1;
}
async function fn2() {
return await fn1();
}
(async function() {
const result = await fn2();
})();
是否有任何事件循环魔术可以使 Node.js webapp 中的后一个代码变慢?
【问题讨论】:
-
所有这一切都是用
async函数创建不必要的 Promise 并稍微改变执行顺序。您不会像这样使同步代码异步。 -
async和await是语法糖。本机实现将生成大量额外代码(生成器函数),这些代码将跟踪异步操作完成时下一步要移动的位置。这会增加开销并降低性能。 -
@MarkMeyer 澄清用例:在我的场景中,必须在 fn1() 中实现异步数据库获取操作,并且 fn1() 的调用者必须等待返回结果。这就是为什么我必须以某种方式更改调用链中的函数,例如 fn2()。我不是想无缘无故地做一些异步的事情。 :) 传递回调函数会更有效吗?
-
@MartinLöper 如果您没有
await执行任何操作,请删除async声明。 IE。如果fn(1)是您的异步数据库调用,您可以省略调用并直接返回Promise,如果您不要必须在数据库调用返回后对结果执行任何操作。这意味着您可以将fn2()更改为不是async并直接返回fn1()。唯一需要async关键字的地方是,当你想从异步调用中获取结果时,那是在你的 IIFE 中。 -
很明显,向函数添加不必要的开销确实会减慢它们的速度。这真的出乎意料吗?你为什么要“将之前同步的代码重构为异步代码”?
标签: javascript node.js performance async-await