为什么在 JavaScript 中解构数组比解构对象慢?

Din*_*den 5 javascript optimization v8 destructuring micro-optimization

我已经运行了一些不同的变体,但这是我在 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;
Run Code Online (Sandbox Code Playgroud)

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

如果我要猜测其推理,那就是数组解构运行一些迭代器来循环数组。

jmr*_*mrk 14

(V8 开发人员在此。)

如果我要猜测其推理,那就是数组解构运行一些迭代器来循环数组。

是的。规范几乎要求这样做。

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

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

我问这个绝对是为了微观优化的目的。

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

在这种特殊情况下,我没有理由怀疑数组解构可能会比对象解构慢一些,无论情况如何;但相对差异以及因此是否重要在很大程度上取决于情况(例如:函数大小、调用计数、内联性、使用或忽略的结果、输入是常量还是变化等因素,...)。

因此,我想看看这个问题是否会长期保持稳定,或者是否只是尚未解决。

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

它的设计目的并不是要具有令人难以置信的性能

哦,是的,是的;我们不断努力使其性能更加出色。