我尝试了下一个代码(它在 Google Chrome 和 Nodejs 中显示了类似的结果):
var t = new Array(200000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 27839.499ms
undefined
我还进行了接下来的测试:
var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 449.948ms
undefined
var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(undefined);} console.timeEnd('wtf');
wtf: 406.710ms
undefined
但在 Firefox 中,第一个变体看起来一切都很好:
>>> var t = new Array(200000); console.time('wtf'); ...{t.push(Math.random());} console.timeEnd('wtf');
wtf: 602ms
V8 中会发生什么?
UPD
*神奇地降低性能*
var t = new Array(99999); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 220.936ms
undefined
var t = new Array(100000); t[99999] = 1; console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 1731.641ms
undefined
var t = new Array(100001); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 1703.336ms
undefined
var t = new Array(180000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 1725.107ms
undefined
var t = new Array(181000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 27587.669ms
undefined
如果您预分配,请勿使用.push
因为您将创建一个由哈希表支持的稀疏数组。您可以预分配最多 99999 个元素的稀疏数组 https://github.com/v8/v8/blob/abfa9f17410a2a84c2ac3364e0288f4a8311b9b1/src/objects.h#L2411它将由一个 C 数组支持,之后它是一个哈希表。
对于第二个数组,您将从 0 开始以连续的方式添加元素,因此它将由真正的 C 数组而不是哈希表支持。
大致如此:
如果你的数组索引很好地从 0 到 Length-1,没有空洞,那么它可以用快速 C 数组表示。如果你有
数组中存在漏洞,那么它将由一个慢得多的哈希表表示。例外情况是,如果您预分配一个数组
大小
var a = new Array(N);
//If N < 100000, this will not make the array a hashtable:
a[50000] = "sparse";
var b = [] //Or new Array(N), with N >= 100000
//B will be backed by hash table
b[50000] = "Sparse";
//b.push("Sparse"), roughly same as above if you used new Array with N > 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)