为什么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的性能?
小提琴:
答案 0 :(得分:3)
简单地将该引用分配给数组中的元素将与分配文字值一样快
是的,它基本上是 1 。但是,分配一个对象可能会有所不同
在V2中,ref
仅被分配一次并被重复覆盖,它可能被分配在不在堆上的堆栈上,并且死代码消除甚至可以完全优化它。
在V1中,ref
需要在堆上分配,并在新位置重复分配,因为所有不同的实例都可以从pcs
访问。
V1只比V21吃更多的内存。但是,由于阵列非常小,差异可以忽略不计。如果你使用非常大的,你可以发现差异:http://jsperf.com/array-reference-assignment/3
[1]:嗯,出于某种原因not really。但是我无法解释,除了垃圾收集在你描述内存使用情况时不同