我正在考虑使用本机方法创建包含默认值的数组的方法,最终得到
function pushMap(length, fill){
var a = [], b = [];
a.length = length;
b.push.apply(b,a);
return b.map(function(){return fill;});
}
期待它成为2 or 3比 while 循环慢几倍,因为本机方法必须循环两次,而 while 仅循环一次,所以我将其与jsperf http://jsperf.com/make-filled-array against
function whileLengthNew(len, val) {
var rv = new Array(len);
while (--len >= 0) {
rv[len] = val;
}
return rv;
}
它实际上是18 to 27慢一些(在 Ubuntu 上使用 Google Chrome 进行测试,欢迎浏览器/操作系统)。
到底发生了什么导致了如此大的差异?
我认为这是由于两个主要因素造成的:
内存分配——whileLengthNew
首先创建一个正确大小的数组,然后对其进行操作,pushMap
一次创建一个元素的最终数组map
。这可能会导致多次分配,尤其是在源数组很大的情况下。 (您创建初始的方式a
and b
数组基本上是无关紧要的,因为map
正在建立一个新的数组来返回——它实际上并没有改变任何内容b
)
函数调用开销——在你的调用中map
,您正在为数组的每个元素调用一个函数。这涉及相当多的开销;设置激活记录和作用域链、堆栈操作以及传回返回值。 -- 所有这些都是为了访问函数内恒定的变量。最重要的是,你已经设置了一个闭包,所以即使访问 the fill
变量比它在中慢whileLengthNew
版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)