【问题标题】:For Javascript game engines, is re-using a global variable more or less efficient than making locals?对于 Javascript 游戏引擎,重用全局变量比制作本地变量效率更高还是更低?
【发布时间】:2013-04-05 08:24:09
【问题描述】:

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

【问题讨论】:

  • @jantimon - 你有基准吗?

标签: javascript performance memory garbage


【解决方案1】:

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

modified your test a bit 对全局变量进行了 50 次访问,结果非常显着,在此特定测试中(对于我在 Firefox 19.0 中的简短测试)而言,本地访问速度快了约 5 倍和 Chrome 26)。

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

【讨论】:

    【解决方案2】:

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

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

    你想要:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 2017-12-30
      • 2017-10-05
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多