array.push(element)vs array [array.length] =元素
这个问题在这里已经有了答案:
使用当前的JavaScript技术最简单的方法是使用最少的代码,最先存储最后一个元素,从而分配完整的数组索引,然后在存储元素时向后计数到0,从而利用附近的优势内存存储位置并最大限度地减少缓存未命中。
var arr3 = [];
for (var i = len; i>0;){
i--;
arr2[i] = numbers[i] * 2;
}
alert(arr2);
请注意,如果在JavaScript引擎视图中存储的元素数量“足够大”,那么该数组将被创建为“稀疏”数组,并且永远不会转换为常规平面数组。
是的,我可以支持这一点。 唯一的问题是JavaScript优化器在丢弃未使用的计算时非常积极。 因此,为了公平地计算结果,所有结果必须被存储(临时)。 我认为已经过时,但实际上进一步提高速度的另一个优化是使用new Array(*length*)
预先初始化阵列。 这是一个古怪的伎俩,一段时间没有什么区别,但在极端的JavaScript引擎优化的日子里,它似乎再次有所作为。
<script>
function arrayFwd(set) {
var x = [];
for (var i = 0; i<set.length; i++)
x[x.length] = set[i];
return x;
}
function arrayRev(set) {
var x = new Array(set.length);
for (var i = set.length; i>0;) {
i--;
x[i] = set[i];
}
return x;
}
function arrayPush(set) {
var x = [];
for (var i = 0; i<set.length; i++)
x.push(set[i]);
return x;
}
results = []; /* we'll store the results so that
optimizers don't realize the results are not used
and thus skip the function's work completely */
function timer(f, n) {
return function(x) {
var n1 = new Date(), i = n;
do { results.push(f(x)); } while (i-- > 0); // do something here
return (new Date() - n1)/n;
};
}
set = [];
for (i=0; i<4096; i++)
set[i] = (i)*(i+1)/2;
timers = {
forward: timer(arrayFwd, 500),
backward: timer(arrayRev, 500),
push: timer(arrayPush, 500)
};
for (k in timers) {
document.write(k, ' = ', timers[k](set), ' ms<br />');
}
</script>
歌剧12.15:
向前= 0.12ms向后= 0.04ms推动= 0.09ms
Chrome(latest,v27):
向前= 0.07ms向后= 0.022ms推动= 0.064ms
(为了比较,当结果未被存储时,Chrome产生这些数字:向前= 0.032ms向后= 0.008ms推动= 0.022ms
与阵列前锋相比,这个速度几乎快四倍,而且比推进速度快三倍。)
IE 10:正向= 0.028ms反向= 0.012ms推动= 0.038ms
奇怪的是,Firefox仍然显示推送速度更快。 当使用push时,必定会有一些代码在Firefox的背后重写,因为访问属性和调用函数比单纯使用未增强JavaScript性能的数组索引要慢。
链接地址: http://www.djcxy.com/p/17931.html