对于Javascript游戏引擎,重新使用全局变量的效率是否比制作本地变量更高或更低?

时间:2013-04-05 08:24:09

标签: javascript performance memory garbage

许多Javascript性能指南倾向于强调两点:

  • 留在范围内;在每个范围内逐步查找变量是很昂贵的。
  • 不要通过不断创建不必要的变量来滥用垃圾收集器。

对于以60fps或类似高速运行的程序,性能是否存在差异? JSPerf似乎在我的系统中介于两者之间,所以我想更多地了解如何针对这类内容进行优化。考虑以下两个代码示例:

var t0;

function doSomethingGlobal() {
    t0 = getWhatever();
    t0.func1();
    t0.func2();
}

function doSomethingLocal() {
    var t0 = getWhatever();
    t0.func1();
    t0.func2();
}

http://jsperf.com/global-verses-local

2 个答案:

答案 0 :(得分:2)

我认为这取决于您访问全局变量的频率,以及全局变量在执行上下文中的嵌套程度。例如,从一个执行上下文“更高”访问变量会更快,而不是从十个更高级别访问一个变量(取决于JS引擎,我想结果和引擎优化会有所不同)。

modified your test a bit对全局变量进行了50次访问,结果非常重要,本次访问的速度提高了〜5倍在此特定测试中(对于我的简短测试) Firefox 19.0和Chrome 26)。

与所有与绩效相关的问题一样,经验法则只能让你到目前为止。 必须对您的代码进行基准测试,并对您的代码进行有意义的优化。

答案 1 :(得分:1)

请注意,您的第二个陈述并不完全正确。你说:

  

不要通过创建不必要的变量来滥用垃圾收集器   不断。

你想:

  

不要通过分配不必要的对象来滥用垃圾收集器   不断。

这不是用于存储变量问题的位置(这是区分本地和全局时所说的),因为局部变量将在堆栈上分配,这既便宜又容易。它跟踪存储在这些位置的对象,无论您存储引用的位置都会大致相同。

众所周知,全局变量的查找速度通常较慢,因此这是避免它们的一个原因。它们也更难以使用,并且导致代码更难以维护,这在我看来是避免它们的最大原因。从垃圾收集器的角度来看,没有理由选择其中一个。

最后,除非你有特别的理由相信变量访问会大大减慢你的页面速度,你为什么要担心它们的性能呢?首先编写可维护的代码!