array.push(element)和array[array.length] = element的区别

14 浏览
0 Comments

array.push(element)和array[array.length] = element的区别

这个问题在这里已有答案:
如何将内容追加到数组中?
为什么array.push有时比array[n]=value更快?

我想知道选择

array.push(element)

还是

array[array.length] = element

是否有原因。

这里是一个简单的例子,其中我有一个数字数组,并希望创建一个将这些数字乘以2的新数组:

var numbers = [5, 7, 20, 3, 13];
var arr1 = [];
var len = numbers.length;
for(var i = 0; i < len; i++){
    arr1.push(numbers[i] * 2);
}
alert(arr1);
var arr2 = [];
for(var i = 0; i < len; i++){
    arr2[arr2.length] = numbers[i] * 2;
}
alert(arr2);

0
0 Comments

当前使用最小代码的最快方法是先存储最后一个元素,从而分配完整的数组索引集,然后从后向前计数到0并存储元素,从而利用附近的内存存储位置并最小化缓存未命中。

var arr3 = [];
for (var i = len; i>0;){
    i--;
    arr2[i] = numbers[i] * 2;
}
alert(arr2);

请注意,如果要存储的元素数量在JavaScript引擎的观点中足够大,则数组将作为“稀疏”数组创建,并永远不会转换为常规平坦数组。

是的,我可以证明这一点。唯一的问题是JavaScript优化器在丢弃未使用的计算时非常激进。因此,为了公平地计算结果,所有结果都必须被存储(临时)。我认为已经过时的一项进一步优化,实际上可以进一步提高速度,即使用new Array(*length*)预初始化数组。这是一个老生常谈的技巧,在一段时间内没有任何区别,但在极端的JavaScript引擎优化时代,它似乎再次有所不同。


Opera 12.15:

正向 = 0.12毫秒
反向 = 0.04毫秒
push = 0.09毫秒

Chrome(最新版本v27):

正向 = 0.07毫秒
反向 = 0.022毫秒
push = 0.064毫秒

(为了比较,当结果不存储时,Chrome会产生以下数字:
正向 = 0.032毫秒
反向 = 0.008毫秒
push = 0.022毫秒

这几乎比正向操作快四倍,比使用push快三倍。)

IE 10:
正向 = 0.028毫秒
反向 = 0.012毫秒
push = 0.038毫秒

奇怪的是,Firefox仍然显示push更快。当使用push时,Firefox在后台可能进行一些代码重写,因为在纯粹的、未增强的JavaScript性能方面,访问属性和调用函数都比使用数组索引慢。

0