【发布时间】: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