我一直在寻找一些JavaScript代码,旨在运行在性能敏感的环境中,主要是游戏引擎移动环境。是否使用局部变量(而不是重复的属性访问)曾经伤害过性能?
在许多情况下,此代码不使用局部变量,而是倾向于使用显式链,例如,
if (this.x.y[z].i) {
this.x.y[z].a += this.x.y[z].b;
}
在哪里都this.x.y
和this.x.y.z
表示“复制” - ,并且其中没有中间特性的具有吸气剂,并且其中q
不是在别处使用的局部变量 - 可被处理语义上等同于以下内容。
var q = this.x.y[z]
if (q.i) {
q.a += q.b;
}
(名字一直保持模糊的特别尝试和减轻偏见,这个问题是不是该“模式”跟随 - 虽然我更喜欢后者,并打算用它100%,因此在问这个问题。)
现在,在我收到有关“为清晰度编写代码”和“不要过早优化”的评论之前,请继续阅读!
因此,考虑以下断言/公理,并指出,这一问题是不有关如何提高性能,而如果使用本地缓存/“别名”变量可以对相关的JavaScript实现下降性能:
- 介绍一个局部变量,当多次访问一个成员时,会导致更清晰的代码。 (这是主观的,但是为了这个问题是一个公理。)
- 对于非动态属性使用局部变量,如图所示,将始终具有相同的语义。
- 有否通过局部变量创建闭包;因此不用担心增加对象的生命周期或以其他方式保持较大的执行上下文范围。
- 重点是移动浏览器,包括非/低JIT品种 - 例如, JavaScriptCore和/或任何关于V8之前的Android。
- 浏览器已经在这种情况下进行了很好的优化,预计不会使用局部变量会导致任何显着的“性能”增加 - 这个问题是相反的。
能/会使用局部变量而不是[多]直接财产访问结果的在性能下降?如果这种减少是“不可忽略的......”
你回答这个问题的方式是通过测试。一般来说,缓存一个局部变量的值不会影响性能,并可能会改善它。 – 2014-10-06 05:08:33