为什么解构 javascript 中的数组比解构对象慢?

Why is destructuring an array in javascript slower than for an object?

我有 运行 几个不同的变体,但这是我在 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 引擎)could/should 运行 数组解构更快;但是,在这种情况下,我无法对测试进行更改。

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

(此处为 V8 开发人员。)

If I were to poke a guess at the reasoning, it'd be that array destructuring runs some iterator to loop through the array.

是的。 The spec 非常需要这样。

WHY would you iterate for statically known properties?

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

I am definitely asking this for the purpose of micro-optimization.

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

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

So, I'm looking to see if this is likely to remain steady for a long time, or if it's something just not addressed yet.

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

It's not designed to be incredibly performant

哦,是的,是的;我们一直在努力提高它的性能。