【问题标题】:Why is destructuring an array in javascript slower than for an object?为什么在javascript中解构数组比对象慢?
【发布时间】:2021-02-22 14:44:45
【问题描述】:

我已经运行了一些不同的变体,但这是我在 jsbench.me 上进行的基本测试:

https://jsbench.me/j2klgojvih/1

这个初始基准有一个明显的初始优化,可以显着加快对象解构速度。如果将 t 的声明移动到每个测试块中,那么底层优化就会消失,但数组解构仍然会失败。

测试是一个简单的概念,表示为:

const t = [1, 2, 3];

// Test 1 (Slower)
const [x, y, z] = t;

// Test 2 (Faster)
const {0: x, 1: y, 2: z} = t;

我认为 V8(或任何 JS 引擎)可以/应该更快地运行数组解构;但是,在这种情况下,我无法对测试进行更改。

如果我猜测其中的原因,那就是数组解构会运行一些迭代器来循环遍历数组。

【问题讨论】:

  • 不拖网though the code base。我想这是由于属性访问为O(1) 而数组访问为O(1-n)....数组解构会运行一些迭代器来循环遍历数组是的,你认为它会如何访问数组?
  • 他们说他们已经优化了 React 模式,但最多有 2 个属性,不超过 2 个。解构数组意味着确保 length 边界被保留,后面有一个迭代舞蹈,并且很快。解构对象属性意味着直接访问对象并分配那里的任何值。如果您可以通过代码想到任何方法来做到这一点,后一种情况就是 const x = t[0], const y = t[1], and const z = t[2] ...右手边没有不需要太多的迭代或检查。
  • @Liam 我希望一组数组属性访问能够不使用迭代方法。我的意思是,编译器确切地看到要检索多少属性,它实际上可以为您创建对象解构模式。为什么要迭代静态已知属性?
  • 这都是微优化的味道。是的,在那个测试中,这更慢。但对于 99% 的场景来说,它可能已经足够快了。那么开发人员加快速度的动机是什么?还有更重要的功能需要实现
  • @Liam 我绝对是出于微优化的目的而要求这个。对于 99% 的 JS 开发人员来说,这不是一个问题 :) 我正在研究一些非常难以推动 JS 限制的项目。

标签: javascript optimization v8 destructuring micro-optimization


【解决方案1】:

(这里是 V8 开发人员。)

如果我猜测其中的原因,那就是数组解构会运行一些迭代器来循环遍历数组。

是的。 The spec 非常需要这种方式。

为什么要迭代静态已知属性?

在 JavaScript 中,“静态已知”的东西比最初看起来要少得多。即使它们在微基准测试中是静态可导出的,也可能不足以为它们进行优化,因为实际代码往往要复杂得多。

我绝对是出于微优化的目的。

请注意,微基准测试通常具有误导性,即使对于微优化也是如此。如果您的实际用例与基准测试不同,那么基准测试的结果很可能不具有代表性,因此很可能会导致您将时间浪费在没有帮助甚至适得其反的事情上。

在这种特殊情况下,我没有理由怀疑无论环境如何,数组解构都可能比对象解构要慢一些。但是相对差异以及是否重要取决于具体情况(例如:函数大小、调用次数、可内联性、使用或忽略的结果、输入是恒定的还是变化的......)。

所以,我想看看这是否可能会长期保持稳定,或者它是否只是尚未解决的问题。

我不知道数组解构中是否还有很多未开发的性能潜力,也不知道是否/何时有人会研究它。

它的设计初衷并不是为了实现令人难以置信的性能

哦,是的,是的;我们一直在努力使其性能更加出色。

【讨论】:

  • 感谢回复 :) 确认迭代并链接到规范肯定解决了我的问题。是的,我通常会尽量小心,以免陷入基准测试中的特殊情况优化......在确定我真的看到性能差异之前,我运行了比指示更多的测试。调查这绝对是一件愚蠢的事情,但我喜欢研究这些东西。感谢您在 v8 上所做的工作!
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 2017-04-03
  • 2018-12-27
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
相关资源
最近更新 更多