Javascript强制数组表现得像数组一样

时间:2014-11-23 02:43:56

标签: javascript arrays

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,似乎预先填充阵列是一个好主意。

1 个答案:

答案 0 :(得分:0)

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

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