3 回答
TA贡献1844条经验 获得超8个赞
这些是我通过测试得到的结果
在Safari上:
Array.push(n)1,000,000个值:0.124秒
数组[n .. 0] =值(降序)1,000,000个值:3.697秒
数组[0 .. n] =值(升序)1,000,000个值:0.073秒
在FireFox上:
Array.push(n)1,000,000个值:0.075秒
数组[n .. 0] =值(降序)1,000,000个值:1.193秒
数组[0 .. n] =值(升序)1,000,000个值:0.055秒
在IE7上:
Array.push(n)1,000,000个值:2.828秒
数组[n .. 0] =值(降序)1,000,000个值:1.141秒
数组[0 .. n] =值(升序)1,000,000个值:7.984秒
根据你的测试,推送方法似乎在IE7上更好(差异很大),并且由于在其他浏览器上差异很小,似乎推送方法确实是向阵列添加元素的最佳方式。
但是我创建了另一个简单的测试脚本来检查快速将值附加到数组的方法,结果让我感到惊讶,使用Array.length似乎比使用Array.push要快得多,所以我真的不知道是什么再说一遍,我一无所知。
顺便说一句:在我的IE7上你的脚本停止了,浏览器问我是否要让它继续下去(你知道典型的IE消息说:“停止运行这个脚本?...”)我会重新尝试减少一点循环。
TA贡献1818条经验 获得超3个赞
push()
是更普遍的[[Put]]的特例,因此可以进一步优化:
在数组对象上调用[[Put]]时,必须首先将参数转换为无符号整数,因为所有属性名称(包括数组索引)都是字符串。然后必须将其与数组的长度属性进行比较,以确定是否必须增加长度。推送时,不需要进行这样的转换或比较:只需使用当前长度作为数组索引并增加它。
当然还有其他一些会影响运行时的东西,例如调用push()
应该比调用[[Put]] via慢,[]
因为必须检查原型链的前者。
正如olliej指出的那样:实际的ECMAScript实现将优化转换,即对于数字属性名称,不会进行从字符串到uint的转换,只需进行简单的类型检查。基本假设应该仍然有效,尽管其影响将小于我原先假设的影响。
- 3 回答
- 0 关注
- 827 浏览
添加回答
举报