为什么push方法比在Javascript中通过数组索引放置值要慢得多

Pau*_*ski 12 javascript arrays performance benchmarking hashtable

我很不明白为什么这个测试:

http://jsperf.com/push-method-vs-setting-via-key

显示出来

 a.push(Math.random());
Run Code Online (Sandbox Code Playgroud)

比...慢十倍

 a[i] = Math.random();
Run Code Online (Sandbox Code Playgroud)

你能解释一下为什么会这样吗?什么魔法"推"使它变得如此之慢?(与其他有效的方法相比,这种方法很慢).

编辑

注意:推送测试是有偏见的.我每次迭代都会增加数组的大小!阅读仔细接受的答案!

基准测试结果

Ber*_*rgi 16

你能解释一下为什么会这样吗?

因为你的测试存在缺陷.所述push不总是追加到现有a阵列使它大得多,而第二测试并仅使用第一指标1000.使用setup这里还不够,你必须a在每个for循环之前重置数组:http://jsperf.com/push-method-vs-setting-via-key/3.

除此之外,方法调用push可能有一点开销,并且与使用for循环的索引相比,确定当前数组长度可能需要额外的时间.

通常没有理由不使用push - 该方法完全用于操作,并使一些代码更容易阅读.虽然有些人认为一个版本比另一个版本更快,但两者都在浏览器中同样优化.请参阅为什么array.push有时比array [n] = value更快?在添加到数组时使用push方法或.length? - 结果差异很大,实际上是无关紧要的.使用更好的理解.

  • @bluesm:是的,内存分配是杀死“push”版本的原因。 (2认同)