3

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

4

2 回答 2

2

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

我对您的测试进行了一些修改,以对全局变量进行 50 次访问,结果非常重要,在此特定测试中本地访问速度快了约 5 倍(对于我在 Firefox 19.0 和 Chrome 26 中的简短测试)。

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

于 2013-04-05T09:05:47.480 回答
1

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

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

你要:

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

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

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

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

于 2013-04-05T10:30:18.037 回答