Javascript强制数组的行为类似于数组
Javascript forcing array to behave like array
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中的运行速度慢了两倍。因此,如果您正在编写诸如空间哈希图之类的东西,那么首先填写它似乎是一个好主意。
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- Java中的数组,具有类似Javascript数组的性质
- jQuery-在数组中搜索类似的元素
- 使用数据数组创建多个类似组件
- 查找数组's按属性不存在于另一个数组中的对象
- 用null填充稀疏数组(类似于压缩两个数组)
- 在对象上迭代以验证它是否's键存在于数组中
- 使用类似于 Array.prototype.map() 的方法将数组转换为键值对象
- Javascript强制数组的行为类似于数组
- 创建类似于javascript数组的c#数组
- 将类似于长度的属性添加到javascript数组中
- 删除对象属性类似于删除带有拼接的数组元素
- JavaScript -数组的行为类似于对象
- 如何将数组应用于视图
- 我如何动态地添加到JavaScript对象类似于JavaScript的数组推送函数
- Openlayers 3,将特征数组应用于矢量结果getId()不是一个函数
- 循环URL和加载使用数组依赖于ID
- 函数类似于map();t创建新数组
- 搜索字符串是否存在于类似indexOf的数组的任何值中
- 如果数组存在于本地存储中,则返回false