对于Javascript游戏引擎,重用全局变量是否比使用局部变量更有效?

For Javascript game engines, is re-using a global variable more or less efficient than making locals?

本文关键字:局部变量 有效 是否 全局变量 游戏 Javascript 引擎 对于      更新时间:2023-09-26

很多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

我认为这取决于你访问全局变量的频率,以及全局变量在执行上下文中嵌套的深度。例如,从一个"更高"的执行上下文访问变量要比从10个更高的执行上下文访问变量要快(取决于JS引擎,我想结果和引擎优化会有所不同)。

我已经修改了你的测试,有50个访问全局变量,结果是显著的,~5倍的本地访问在这个特定的测试(我在Firefox 19.0和Chrome 26的简短测试)。

对于所有与性能相关的问题,经验法则只能帮助您到此为止。必须对你的代码进行基准测试,并对你的代码进行有意义的优化。

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

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

你想:

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

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

我们知道,全局变量查找起来通常比较慢,所以这是避免使用全局变量的一个原因。它们也更难使用,导致代码更难以维护,这在我看来是避免使用它们的最大原因。从垃圾回收者的角度来看,没有理由选择其中一个而不选择另一个。

最后,除非您有特定的理由相信变量访问会显著降低页面速度,否则为什么要担心它们的性能呢?首先编写可维护的代码!