[英]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.