在Promises上链接太多`.then`会对性能产生什么影响(如果有)?

理通

我有一个reduce的实现,它可能将许多.then处理程序链接在一起。

const reduceIterable = (fn, x0, x) => {
  const iter = x[Symbol.iterator].call(x)
  let cursor = iter.next()
  if (cursor.done) {
    throw new TypeError('reduce(...)(x); x cannot be empty')
  }
  let y = !isUndefined(x0) ? fn(x0, cursor.value) : (() => {
    const x0 = cursor.value
    cursor = iter.next()
    return cursor.done ? x0 : fn(x0, cursor.value)
  })()
  cursor = iter.next()
  while (!cursor.done) {
    const { value } = cursor
    y = isPromise(y) ? y.then(res => fn(res, value)) : fn(y, value)
    cursor = iter.next()
  }
  return y
}

// you would use reduce like reduce(add, 0)([1, 2, 3]) // => 6
const reduce = (fn, x0) => {
  if (!isFunction(fn)) {
    throw new TypeError('reduce(x, y); x is not a function')
  }
  return x => {
    if (isIterable(x)) return reduceIterable(fn, x0, x)
    if (isAsyncIterable(x)) return reduceAsyncIterable(fn, x0, x)
    if (is(Object)(x)) return reduceObject(fn, x0, x)
    throw new TypeError('reduce(...)(x); x invalid')
  }
}

具体来说,我在看y.then(res => fn(res, value))由于这个问题,这使我无法入睡我知道自那时以来,承诺已经走了很长一段路,但这从未得到解决。我真的很想知道我是否可以使用这样的Promise API,或者是否需要做一些更难的事情。

jfriend00

如果.then在Promises上链接太多s,会对性能产生什么影响(如果有)

如果您比较一个.reduce()循环,在循环中您.then()将彼此串联在一起以对异步操作进行排序,然后将其与await异步函数中的一个循环(在该循环中您先执行一个操作再开始下一个操作)进行比较,则主要区别在于峰值内存使用率。链接.then()在一起将使所有promise对象的完整链一次存储在内存中。如果执行await循环,则一次只能激活一个诺言。

现在,promise并不是大对象,因此即使您的链长成千上万个元素,它也可能仍然没有实质性的区别。但是,如果要最大程度地减少峰值内存使用量,则await循环将使峰值内存使用量降低。

至于纯粹的执行速度,故事一如既往。如果您真正关心执行速度,则必须使用.reduce()循环编写一个代表性的测试程序,并使用一个await循环生成等效的输出和排序的程序,并对两者进行基准测试。性能是如此取决于特定的环境,如果您真的想知道哪个更快,则必须衡量。理论化通常是错误的,因为我们的直觉并不总是知道真正的瓶颈是什么。你必须测量。

仅供参考,async/await在最近的几个nodejs版本中已经加速了很多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用SecurityManager会对性能造成什么影响(如果有)

在具有240个或更多元素的数组上循环时,为什么会对性能产生较大影响?

Windows 7上的PID 0和PID 4之间存在什么进程(如果有)?

解开swift可选类型时,性能受到什么影响(如果有)?

使用太多的SemaphoreSlim(N)来管理并发性是否会对性能产生影响?

通过两个或多个“链接”路由器访问Internet的缺点(如果有)是什么?

在OSX上开发asp.net会遇到什么限制(如果有)?(在2015/2016年)

如果将nodejs进程放入docker容器,会对性能产生什么影响?

如果有的话,美丽的汤提取多个链接

Blazor链接-如果有onclick方法,请禁用href

通过镜像同一USB驱动器上的分区可以获得什么(如果有的话)?

如果有 FileReader(),如何在 keyup 事件上激活提交按钮

如果有多个字段,则在重复的密钥更新上

如何在Windows上监视文件夹的更改并执行命令(如果有)?

VPP帐户-如果有可用更新,用户会在应用商店上看到徽章吗?

删除每行上的注释(如果有的话)

如果有多台摄像机,则使用RayCast在Sprite上捕获触摸

掩码数组的fill_value有什么实际影响(如果有)?

遍历Java中的所有字符串会对性能产生什么影响?

为什么方法断点会对性能产生负面影响?

Java中的if(!foo)和if(foo == false)之间的性能差异(如果有)是什么?

为什么“-XX:+UseLWPSynchronization”会对 Windows 操作系统上的印章锁定产生负面影响?

有没有办法将值放在预设的句子上,如果有重复的单词,将其替换?

如果所有类都包含许多有用的类变量,那么会对性能产生影响吗?

如何让 Alexa 正确响应:Alexa,询问(告诉)[调用名称](链接词,如果有)[意图表达]?

Oracle Apex.如果有任何未保存的更改,则停止页面卸载(当单击可导航链接时)

在原始驱动器(sdx)与分区(sdx1)上运行luksFormat是否有优点/缺点(如果有)?

如果有数据库演变,Bamboo无法在playframework上启动应用程序

VBA Vlookup条件(如果有的话)源数据和vlookup范围在不同的工作表上