对于Javascript游戏引擎,重用全局变量是否比使用局部变量更有效?
For Javascript game engines, is re-using a global variable more or less efficient than making locals?
很多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的简短测试)。
对于所有与性能相关的问题,经验法则只能帮助您到此为止。你必须对你的代码进行基准测试,并对你的代码进行有意义的优化。
请注意,您的第二个陈述并不完全正确。你说:
不要通过创建不必要的变量来滥用垃圾收集器不断。
你想:
不要通过分配不必要的对象来滥用垃圾收集器不断。
存储变量的位置不是问题所在(这就是你在区分局部和全局时所说的),因为局部变量将在堆栈上分配,这既便宜又容易。它跟踪存储在这些位置的对象,无论您将引用存储在何处,其成本基本上是相同的。
我们知道,全局变量查找起来通常比较慢,所以这是避免使用全局变量的一个原因。它们也更难使用,导致代码更难以维护,这在我看来是避免使用它们的最大原因。从垃圾回收者的角度来看,没有理由选择其中一个而不选择另一个。
最后,除非您有特定的理由相信变量访问会显著降低页面速度,否则为什么要担心它们的性能呢?首先编写可维护的代码!
相关文章:
- Javascript用函数return替换局部变量
- 每次调用函数时,都要修改Javascript中的局部变量
- 局部变量在闭包中丢失
- 试图将一个局部变量传递给我的ngAside控制器
- jQuery.ajax()访问javascript循环中的beforeEnd局部变量
- 如何使用局部变量创建全局变量
- 如何在单击链接后将局部变量发送到部分呈现
- 定义 JavaScript 类的局部变量
- 创建所有原型函数均可访问的局部变量
- 局部变量的声明
- JavaScript:在调用之前将函数重新分配给局部变量,而不是直接调用并对'这'
- 为什么 Javascript 中的类变量在尝试多次调用它们或将它们分配给局部变量时会消失
- 函数中的局部变量
- 局部变量仍可通过函数访问
- JavaScript和局部变量是不好的做法
- 局部变量在应用 function.call() 后变为全局变量
- 如何创建一个只应用了一些过滤器的局部变量
- 我可以't克服这个错误“;未定义的局部变量或方法`f'"任何原因
- 在d3.js中将局部变量转换为全局变量
- 对于Javascript游戏引擎,重用全局变量是否比使用局部变量更有效?