2012-12-28 36 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

相关问题