2012-12-28 35 views
8

最近,我一直在優化JavaScript代碼以製作HTML5遊戲,特別針對移動瀏覽器。我開始比較引擎並逐漸簡化了比較代碼,並且我得到了一些我不明白的東西。爲什麼修改全局變量會增加Chrome中的內存使用量

這種情況是我注意到,在Chrome(所以我猜所有基於webkit的瀏覽器)修改全局變量導致增加使用的內存。讓我告訴你兩個例子:

1)修改全局變量:

代碼:

var globalVariable = 0; 

var fps = 60; 
window.onload = init; 

function init() { 
    setInterval (loop, 1000/fps); 
}; 


function loop(){ 

    for (var i = 0; i < 1000000; i++) { 
    globalVariable = Math.random(); 
    } 
}; 

記憶時間軸的畫面:Memory 1

正如你可以看到它有很多的內存收集在前10秒!

2)創建本地變量,而不是修改一個全球:

代碼保持相同,唯一的改變是增加關鍵字「VAR」的環內。 globalVariable = Math.random();變成var localVariable = Math.random();

畫面存儲時間軸:Memory 2

正如你可以看到內存使用率非常低,對於前10秒,它只是增加了約0.1MB。

區別真的很大!我現在無法檢查它,但我被告知,在這兩個例子的Firefox中,這兩種情況下的內存使用情況幾乎相同。

任何人都可以解釋我,或指出我解釋的資源嗎?或者任何人都可以建議我如何修改全局變量不增加使用的內存?

+0

下面是演示的鏈接,由於新用戶的兩個鏈接限制,我無法在原始文章中發佈它們。 https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingGlobalVar.html https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingLocalVar.html – Jorasso

+0

很有意思:你會覺得這種差異將是另一種方式!我的理論是,在全局變量的循環之外尋找更多的內存使用,而不是在相同的作用域內創建它。就像在for循環中使用它之前緩存數組的長度具有相同的積極效果一樣。 – 0x499602D2

+0

如果chrome能夠確定你不用局部變量做任何事情並且能夠完全跳過代碼,那麼我不會感到驚訝,但是在全局變量的情況下,很難判斷某人是否正在使用它。 –

回答

2

(第一,關於「全球」變量快速咆哮。有在Javascript中沒有全局變量,也有範圍,包括窗口級範圍內)

但是,得到的答覆是,訪問來自另一個變量範圍在Javascript中的函數將它提升到當前範圍。 Here's a fun explanation of the effect.

+0

因此,該變量以某種方式被複制,這會導致內存使用情況? –

+0

該變量未被複制 - 範圍是通過其中的變量創建的。 – tmcw

相關問題