Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象引用保存到阵列时的性能问题_Javascript_Performance - Fatal编程技术网

Javascript 将对象引用保存到阵列时的性能问题

Javascript 将对象引用保存到阵列时的性能问题,javascript,performance,Javascript,Performance,为什么v1比v2慢那么多 v1-- v2-- 我认为,由于我在“ref”中保存了对新对象的引用,因此简单地将该引用分配给数组中的一个元素将与分配一个文本值一样快,但结果表明,分配引用的速度要慢得多。有人能解释一下吗?我能做些什么来提高V1的性能 小提琴: 简单地将该引用赋值给数组中的一个元素,大约与赋值一个文本值一样快 是的,基本上是1。但是,分配一个对象可能会造成不同。 在V2中,ref只分配一次并被重复覆盖,它可能被分配到堆栈上而不是堆上,消除死代码甚至可以完全优化它。 在V1中,ref需

为什么v1比v2慢那么多

v1--

v2--

我认为,由于我在“ref”中保存了对新对象的引用,因此简单地将该引用分配给数组中的一个元素将与分配一个文本值一样快,但结果表明,分配引用的速度要慢得多。有人能解释一下吗?我能做些什么来提高V1的性能

小提琴:

简单地将该引用赋值给数组中的一个元素,大约与赋值一个文本值一样快

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

V1只是消耗了比V21更多的内存。但是,由于数组非常小,差异是可以忽略的。如果您使用的是非常大的一个,您可以发现差异:


[1] :嗯,出于某种原因。但我无法解释,除了垃圾收集在您分析内存使用情况时是不同的之外

where循环终止条件???@ozil:where总是这样,它是“header”的
的第二部分,
n--
。如果它返回
0
,则循环终止。@Felix Kling在
0
基本上已经尽了最大努力之后,它没有减量。如果您需要保存一个引用(其中包含的数据多于一个数字),那么这就是您所能做的。另一方面,问问自己,为什么你需要在这样的任务中提高表现。显然,这些片段是概念的证明,所以只有你们知道背后是什么。对我来说,差别是微不足道的。不足以确定v1和v2之间的字面差异:我认为这是正确的答案,除了“v1”和“v2”在当前版本中是相反的。可能进行该更新(如果您同意我的意见)会使其被接受。@Bergi“可能在堆栈上而不是在堆上分配”可以描述为“堆栈”、“堆”;两者的区别,对于一个在计算机科学中可能没有这些术语的非专业参考点的观众来说?@guest271314:vs.你能重现OP报告的性能差异吗?其中一条评论发布了一个链接,显示没有性能差异(),我注意到控制台运行着同样的东西。我想知道OP最初是如何看到这两个版本之间的性能差异的。@GabrielSouthern:是的,请参阅我答案中基于RGrahams版本的jsperf链接。然而,对于大小为32的阵列来说,这些差异确实是可以忽略的。
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;    //*****
}
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;    //*****
}