TL;DR -- 从内存管理的 Angular 来看,这两种返回值的方法有什么区别?它们在游戏循环中进行管理,每秒修改数千次。
return { x: x1 + x2, y: y1 + y2, z: z1 + z2 }
// VS
predeclared.x = x1 + x2;
predeclared.y = y1 + x2;
predeclared.z = z1 + x2;
return predeclared;
感谢您的任何见解!
某些上下文...在 webGL/three.js 程序中,在某些情况下,预先声明一个虚拟引用是有益的,该虚拟引用将用于每帧临时保存一个对象,而不是创建一个新对象来协助垃圾收集.我很确定这是一种常见的做法,但以防万一它看起来像这样:
let mesh;
while( true ) {
mesh = getNewMeshFrame( time );
renderStuff( mesh );
}
我不确定在如下情况下使用正确的技术。
// With just ONE predeclared object and an object literal in the return statement
function box() {
let box = { x: 0, y: 0 };
this.transform = function( addX, addY ) {
return { x: box.x + addX, y: box.y + addY };
}
}
// OR, with TWO predeclared objects
function box() {
let box = { x: 0, y: 0 };
let transformed = { x: 0, y: 0 };
this.transform = function( addX, addY ) {
transformed.x = box.x + addX;
transformed.y = box.y + addY;
return transformed;
}
}
我希望很清楚盒子对象是静态的并且不能改变(它是一个复杂得多的对象 IRL),所以我需要将它与其变换分开。谢谢!
最佳答案
每次调用 transform()
时,返回对象字面量的版本都会分配一个新对象。随着时间的推移,这些会在内存中累积,最终需要进行垃圾收集以删除不再使用的那些。
具有预声明变量的版本在每次调用时都会返回对同一对象的引用。所以应该有更少的内存积累,更少的垃圾收集需求。但是,这意味着如果您将多个调用分配给不同的变量,它们都是对同一个对象的引用,该对象正在就地修改。
b = new box();
t1 = b.transform(1, 2);
t2 = b.transform(3, 4);
对于第一个版本,t1
和t2
是不同的对象:
t1 = {x: 1, y: 2}
t2 = {x: 3, y: 4}
在第二个版本中,它们是同一个对象:
t1 = t2 = {x: 3, y: 4}
如果这不是程序其余部分的问题,那么如果您在同一个盒子上多次调用 transform()
,第二个版本应该会显着提高内存效率。
不过,不同盒子之间没有共享。
b1 = new box();
b2 = new box();
在这两个版本中,b1.transform()
和 b2.transform()
之间没有冲突。
关于javascript - JavaScript 中的内存管理技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51390111/