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

对于Javascript游戏引擎,重新使用全局变量是否比使用局部变量更有效?,javascript,performance,memory,garbage,Javascript,Performance,Memory,Garbage,许多Javascript性能指南倾向于强调两点: 保持在范围之内;通过每个作用域逐步查找变量是昂贵的 不要通过不断创建不必要的变量来滥用垃圾收集器 对于以60fps或类似高速运行的程序,性能是否有差异?在我的系统中似乎介于两者之间,所以我想知道更多关于如何优化这类东西的信息。考虑以下两个代码示例: var t0; function doSomethingGlobal() { t0 = getWhatever(); t0.func1(); t0.func2(); }

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

  • 保持在范围之内;通过每个作用域逐步查找变量是昂贵的
  • 不要通过不断创建不必要的变量来滥用垃圾收集器
对于以60fps或类似高速运行的程序,性能是否有差异?在我的系统中似乎介于两者之间,所以我想知道更多关于如何优化这类东西的信息。考虑以下两个代码示例:

var t0;

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

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

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

我必须对全局变量进行50次访问,结果非常显著,在这个特定的测试中,本地访问速度要快5倍左右


与所有与性能相关的问题一样,经验法则只能帮助您做到这一点你必须对你的代码进行基准测试,并对你的代码进行合理的优化。

请注意,你的第二句话并不完全正确。你说:

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

你想要:

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

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

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


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

@jantimon-你有基准吗?