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

时间:2015-05-12 14:47:24

标签: javascript performance

为什么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 个答案:

答案 0 :(得分:3)

  

简单地将该引用分配给数组中的元素将与分配文字值一样快

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

V1只比V21吃更多的内存。但是,由于阵列非常小,差异可以忽略不计。如果你使用非常大的,你可以发现差异:http://jsperf.com/array-reference-assignment/3

[1]:嗯,出于某种原因not really。但是我无法解释,除了垃圾收集在你描述内存使用情况时不同