首页 > 解决方案 > 同步函数的执行速度比异步函数快吗?

问题描述

考虑以下两个片段:

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()

我想知道是否将不打算成为Promises 的多个功能委派给浏览器的 Web API,然后await对它们进行 ing 是否会以任何方式提高性能。进入这个实验,我一半的人期望跑得比我的另一半startPromise要快一点startNoPromise,而另一半人则期望他们跑得 +/- 一样。

但是,单独运行下面的代码片段表明它startNoPromisestartPromise. 对我来说奇怪的是,如果我将这两个片段合并为一个片段,然后执行startNoPromiseand startPromise,那么它们的运行速度或多或少一样快......但单独运行它们会显示出约 1 毫秒的时间差异,并且startNoPromise始终保持计时在大约 2.245 毫秒。

我的问题是为什么我的原始逻辑有缺陷,将非承诺函数变成承诺并将它们外包给 Web API 会使它们运行得更快(因为它们因此会异步运行)?另外,为什么Promise这两个函数的版本执行速度比同步版本慢?

标签: javascriptasynchronous

解决方案


JavaScript 的“问题”是一切都在一个线程中运行,即一次只能做一件事。对 CPU 绑定问题(受 CPU 能力限制的代码)使用 Promise 实际上会使其变慢。速度变慢的原因是 API 调用 Promise 和管理 Promise 都需要 CPU 开销。

另一件需要注意的事情是,对于没有任何等待的 CPU 绑定函数,这些函数无论如何都会串行运行(一个接一个)。另一方面,添加 await 只会让它变得更慢,因为会有更多的管理开销。

Promise 非常适合您必须在主进程之外等待某事完成的代码。大多数情况下,这将是 io。


推荐阅读