javascript - 同步函数的执行速度比异步函数快吗?
问题描述
考虑以下两个片段:
const loop1NoPromise = () => {
let i = 0
for (i; i < 500000; i++) {}
}
const loop2NoPromise = () => {
let i = 0
for (i; i < 500000; i++) {}
}
const startNoPromise = () => {
console.time('No promise')
loop1NoPromise()
loop2NoPromise()
console.timeEnd('No promise')
}
startNoPromise()
const loop1Promise = async () => {
let i = 0
for (i; i < 500000; i++) {}
return new Promise((resolve) => resolve());
}
const loop2Promise = async () => {
let i = 0
for (i; i < 500000; i++) {}
return new Promise((resolve) => resolve());
}
const startPromise = async () => {
console.time('With promise')
await Promise.all([loop1Promise(), loop2Promise()])
console.timeEnd('With promise')
}
startPromise()
我想知道是否将不打算成为Promise
s 的多个功能委派给浏览器的 Web API,然后await
对它们进行 ing 是否会以任何方式提高性能。进入这个实验,我一半的人期望跑得比我的另一半startPromise
要快一点startNoPromise
,而另一半人则期望他们跑得 +/- 一样。
但是,单独运行下面的代码片段表明它startNoPromise
比startPromise
. 对我来说奇怪的是,如果我将这两个片段合并为一个片段,然后执行startNoPromise
and startPromise
,那么它们的运行速度或多或少一样快......但单独运行它们会显示出约 1 毫秒的时间差异,并且startNoPromise
始终保持计时在大约 2.245 毫秒。
我的问题是为什么我的原始逻辑有缺陷,将非承诺函数变成承诺并将它们外包给 Web API 会使它们运行得更快(因为它们因此会异步运行)?另外,为什么Promise
这两个函数的版本执行速度比同步版本慢?
解决方案
JavaScript 的“问题”是一切都在一个线程中运行,即一次只能做一件事。对 CPU 绑定问题(受 CPU 能力限制的代码)使用 Promise 实际上会使其变慢。速度变慢的原因是 API 调用 Promise 和管理 Promise 都需要 CPU 开销。
另一件需要注意的事情是,对于没有任何等待的 CPU 绑定函数,这些函数无论如何都会串行运行(一个接一个)。另一方面,添加 await 只会让它变得更慢,因为会有更多的管理开销。
Promise 非常适合您必须在主进程之外等待某事完成的代码。大多数情况下,这将是 io。
推荐阅读
- javascript - GetResponse Api 集成使用 fetch() 不起作用
- c - 将指针设置为空值
- python - 将 Python 字典插入 Neo4j
- python - 从网站上抓取表格不起作用
- java - 在 Heroku 上为 Java 应用程序部署 Selenium 驱动程序
- google-cloud-platform - 微服务之间如何同步数据?
- java - 想要在异常情况下打印错误消息,但必须从方法返回值
- function - 如何在 Julia 中创建一个函数不返回任何内容?
- python - 如何将 jax vmap 用于嵌套循环?
- regex - AWS Athena regexp_extract() 损坏