为了账号安全,请及时绑定邮箱和手机立即绑定

为什么array.push有时比array [n] = value更快?

为什么array.push有时比array [n] = value更快?

Go
波斯汪 2019-11-23 15:15:26
为什么array.push有时比array [n] = value更快?作为测试一些代码的副作用,我编写了一个小函数来比较使用array.push方法与直接寻址(array [n] = value)的速度。令我惊讶的是,推送方法通常表现得更快,特别是在Firefox中,有时在Chrome中。只是出于好奇:任何人都有解释吗?您可以在此页面找到测试(单击“数组方法比较”)
查看完整描述

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消息说:“停止运行这个脚本?...”)我会重新尝试减少一点循环。



查看完整回答
反对 回复 2019-11-24
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

push() 是更普遍的[[Put]]的特例,因此可以进一步优化:

在数组对象上调用[[Put]]时,必须首先将参数转换为无符号整数,因为所有属性名称(包括数组索引)都是字符串。然后必须将其与数组的长度属性进行比较,以确定是否必须增加长度。推送时,不需要进行这样的转换或比较:只需使用当前长度作为数组索引并增加它。

当然还有其他一些会影响运行时的东西,例如调用push()应该比调用[[Put]] via慢,[]因为必须检查原型链的前者。


正如olliej指出的那样:实际的ECMAScript实现将优化转换,即对于数字属性名称,不会进行从字符串到uint的转换,只需进行简单的类型检查。基本假设应该仍然有效,尽管其影响将小于我原先假设的影响。



查看完整回答
反对 回复 2019-11-24
  • 3 回答
  • 0 关注
  • 827 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信