【发布时间】:2013-06-02 10:43:02
【问题描述】:
我尝试了下一个代码(它在 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
【问题讨论】:
-
你为什么要
new Array(200000)?除了设置length,它什么都不做。 (例如,它不会预先分配任何存储空间,因为数组并不是真正的数组。) -
我写这段代码只是为了测试。我想知道,为什么它表现得如此糟糕。
-
我得走了,没时间回答,但答案很简单。 V8 在您的第一个示例中回退到稀疏数组,并在您的第二个示例中像顺序内存数组一样优化为 C。见code.google.com/p/v8/source/browse/trunk/src/array.js,
-
如果它除了设置长度什么都不做,为什么它会这样工作?
-
@yttrium 我不得不离开(现在是移动设备),但我已请 JS 室的朋友回答这个问题。不用担心你很快就会得到答案,但这是有道理的。
标签: javascript arrays google-chrome firefox v8