保存对象引用数组的性能问题



为什么V1比V2慢得多?

v1 -

var foo = function (a,b,c) { 
   this.a=a; this.b=b; this.c=c; 
}
var pcs = new Array(32);
for (var n=32; n--;) {
    ref = new foo(1,2,3)
    pcs[n] = ref;    //*****
}

v2 -

var foo = function (a,b,c) { 
   this.a=a; this.b=b; this.c=c; 
}
var pcs = new Array(32);
for (var n=32; n--;) {
    ref = new foo(1,2,3)
    pcs[n] = 1;    //*****
}

我认为,由于我对" ref"中的新对象有一个引用,因此仅将该引用分配给数组中的元素就会与分配字面值一样快,但是事实证明分配了引用较慢。谁能为此阐明吗?我可以采取任何措施来改善V1上的性能?

小提琴:

http://jsfiddle.net/a0kw9rl1/1/

简单地将该引用分配给数组中的元素大约与分配字面值

一样快

是的,基本上是 1 。但是,分配一个对象可能会在这里有所不同。
在V2中,ref仅分配一次并反复覆盖,它可能会在堆栈上分配而不是在堆上,而消除代码甚至可能会完全对其进行优化。
在V1中,ref需要在堆上分配,并在新位置反复分配,因为所有不同的实例都可以从pcs访问。

V1比V21多吃记忆。但是,由于您的数组很小,差异可忽略不可。如果您使用的是非常大的,则可以发现差异:http://jsperf.com/array-reference-assignment/3

[1]:嗯,出于某种原因并非如此。但是我无法解释,除了您配置垃圾收集时,当您配置垃圾收集

最新更新