簡體   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