为什么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]:嗯,出于某种原因并非如此。但是我无法解释,除了您配置垃圾收集时,当您配置垃圾收集