【问题标题】:Why modifying global variable increases memory usage in Chrome为什么修改全局变量会增加 Chrome 中的内存使用量
【发布时间】: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


【解决方案1】:

(首先,关于“全局”变量的快速吐槽。Javascript 中没有全局变量,有作用域,包括窗口级作用域)

但是,答案是在 Javascript 的函数中从另一个 作用域 访问变量会将其提升到当前作用域。 Here's a fun explanation of the effect.

【讨论】:

  • 那么,变量以某种方式被复制,导致内存占用?
  • 变量没有被复制——创建了一个包含变量的作用域。
猜你喜欢
  • 2013-02-14
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2023-03-09
  • 2021-05-16
  • 1970-01-01
相关资源
最近更新 更多