Javascript强制数组的行为类似于数组

Javascript forcing array to behave like array

本文关键字:数组 类似于 Javascript      更新时间:2023-09-26

Javascript数组过去只是具有一些特殊语法的对象,但是JIT引擎可以优化数组,使其表现得像具有O(1)访问权限而不是O(log n)访问权限的真正数组。我目前正在编写一个 cpu 密集型循环,我需要确定我获得 O(1) 访问权限而不是 O(log n)。但问题是我可能需要在创建数组 [5231] = obj1 后立即执行,但数组最终将被填充。我担心这种行为可能会欺骗 JIT 认为我将其用作稀疏数组,因此我不会获得所需的 O(1) 访问时间。我的问题是,有没有办法告诉或至少暗示javascript引擎我想要一个真正的数组?

特别是,我是否需要先用值初始化数组?就像用对虚拟对象的引用填充所有内容一样(我的数组将只包含对相同原型或未定义的对象的引用)。只设置 array.length = 6000 就足够了吗?

编辑:基于 http://jsperf.com/sparse-array-v-true-array,似乎事先填充数组是个好主意。

我意识到我在性能分析测试中做了很大的改进,因为它是一个具有不同帧速率的动画程序,我的分析专注于检测 CPU 密集型部分的位置。它不适合在两种方法之间进行比较,因为一种方法只会运行得更慢,但不同函数调用之间的相对 CPU 时间是相同的。

无论如何,我在jspref上写了一个测试:http://jsperf.com/sparse-array-v-true-array 和(除非我犯了错误,所以,请纠正我!与填充版本相比,没有首先填充的随机访问数组在Chrome和Firefox中的运行速度慢了两倍。因此,如果您正在编写诸如空间哈希图之类的东西,那么首先填写它似乎是一个好主意。