【发布时间】:2014-10-03 07:08:14
【问题描述】:
我一直在研究一些旨在在性能敏感的环境中运行的 JavaScript 代码,主要是移动环境中的游戏引擎。
在许多情况下,此代码不使用局部变量,而是更喜欢使用显式链,例如
if (this.x.y[z].i) {
this.x.y[z].a += this.x.y[z].b;
}
this.x.y 和 this.x.y.z 都表示“重复”——中间属性都没有 getter,q 是未在其他地方使用的局部变量——可以在语义上等同于以下内容。
var q = this.x.y[z]
if (q.i) {
q.a += q.b;
}
(名称一直含糊不清,特别是为了减轻偏见;这个问题不是关于要遵循哪种“模式”——尽管我确实更喜欢后者并打算 100% 使用它,因此提出了这个问题。)
现在,在我收到一大堆 cmets 谈论“为清晰而编写代码”和“不要过早优化”之前,请继续阅读!
因此,鉴于以下断言/公理并注意到这个问题不是关于如何提高性能,而是如果使用本地缓存/“别名”变量可以减少相关 JavaScript 实现的性能:
- 引入局部变量,当一个成员被多次访问时,会导致代码更清晰。 (这是主观的,但为了这个问题,这是一个公理。)
- 对非动态属性使用局部变量(如图所示)将始终具有相同的语义。
- 没有在局部变量上创建闭包;因此,无需担心增加对象生命周期或以其他方式占用更大的执行上下文范围。
- 关注移动浏览器,包括非/低 JIT 品种 - 例如JavaScriptCore 和/或 V8 之前的 Android 上的任何内容。
- 浏览器已经针对这种情况进行了很好的优化,预计使用局部变量不会导致任何明显的“性能”提升 - 这个问题正好相反。
能否/将使用局部变量代替 [多个] 直接属性访问导致性能降低?这种减少是“不可忽略的……”
【问题讨论】:
-
您回答此类问题的方式是通过测试。一般来说,在局部变量中缓存一个值不会损害性能,而且可能会提高性能。
标签: javascript performance properties local-variables