[英]Memory management technique in JavaScript
TL; DR-从内存管理的角度来看,这两种返回值的方法有什么区别? 它们在游戏循环中进行管理,并且每秒被修改数千次。
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; } }
我希望很明显,box对象是静态的并且不能更改(它是一个复杂得多的对象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()
之间没有冲突。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.