【发布时间】:2012-12-30 14:53:19
【问题描述】:
最近我一直在优化 javascript 代码以制作 HTML5 游戏,尤其是针对移动浏览器。我从比较引擎开始,逐渐简化比较的代码,我得到了一些我不理解的东西。
我注意到在 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();
}
};
内存时间线屏幕:
如您所见,它在前 10 秒内需要收集大量内存!
2)创建局部变量而不是修改全局变量:
代码保持不变,唯一的变化是在循环中添加关键字“var”。 globalVariable = Math.random();变为 var localVariable = Math.random();
内存时间线屏幕:
如您所见,内存使用量非常低,前 10 秒仅增加了大约 0.1MB。
差别真的很大!我现在无法检查它,但我被告知在两个示例中的 Firefox 中,两种情况的内存使用情况几乎相同。
谁能解释我,或者指出我解释它的资源?或者任何人都可以建议我如何修改全局变量以不增加使用的内存?
【问题讨论】:
-
这里是演示链接,由于新用户的两个链接限制,我无法在原始帖子中发布它们。 dl.dropbox.com/u/54987642/LocalAndGlobalTest/…dl.dropbox.com/u/54987642/LocalAndGlobalTest/…
-
非常有趣:您会认为不同的是相反!我的理论是,在循环之外寻找全局变量会导致更多的内存使用,而不是在同一范围内创建它。就像在 for 循环中使用数组之前缓存数组的长度一样具有相同的积极效果。
-
如果 chrome 能够确定您不对局部变量执行任何操作并且能够完全跳过代码,我不会感到惊讶,但在全局变量的情况下它会是很难判断是否有人在使用它。
-
你运行的是什么版本的 chrome。我看到第二个是一条平线。我正在运行版本
23.0.1271.97 m
标签: javascript html optimization memory webkit