繁体   English   中英

JavaScript中的内存管理技术

[英]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);

在第一个版本中, t1t2是不同的对象:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM