2014-10-03 32 views
5

我一直在寻找一些JavaScript代码,旨在运行在性能敏感的环境中,主要是游戏引擎移动环境是否使用局部变量(而不是重复的属性访问)曾经伤害过性能?

在许多情况下,此代码不使用局部变量,而是倾向于使用显式链,例如,

if (this.x.y[z].i) { 
    this.x.y[z].a += this.x.y[z].b; 
} 

在哪里都this.x.ythis.x.y.z表示“复制” - ,并且其中没有中间特性的具有吸气剂,并且其中q不是在别处使用的局部变量 - 可被处理语义上等同于以下内容。

var q = this.x.y[z] 
if (q.i) { 
    q.a += q.b; 
} 

(名字一直保持模糊的特别尝试和减轻偏见,这个问题是不是该“模式”跟随 - 虽然我更喜欢后者,并打算用它100%,因此在问这个问题。)

现在,在我收到有关“为清晰度编写代码”和“不要过早优化”的评论之前,请继续阅读!

因此,考虑以下断言/公理,并指出,这一问题是有关如何提高性能,而如果使用本地缓存/“别名”变量可以对相关的JavaScript实现下降性能:

  • 介绍一个局部变量,当多次访问一个成员时,会导致更清晰的代码。 (这是主观的,但是为了这个问题是一个公理。)
  • 对于非动态属性使用局部变量,如图所示,将始终具有相同的语义。
  • 通过局部变量创建闭包;因此不用担心增加对象的生命周期或以其他方式保持较大的执行上下文范围。
  • 重点是移动浏览器,包括非/低JIT品种 - 例如, JavaScriptCore和/或任何关于V8之前的Android。
  • 浏览器已经在这种情况下进行了很好的优化,预计不会使用局部变量会导致任何显着的“性能”增加 - 这个问题是相反的。

能/会使用局部变量而不是[多]直接财产访问结果的在性能下降?如果这种减少是“不可忽略的......”

+2

你回答这个问题的方式是通过测试。一般来说,缓存一个局部变量的值不会影响性能,并可能会改善它。 – 2014-10-06 05:08:33

回答

1

答案可能更多取决于浏览器而不是代码。考虑到JavaScript被创建为“解释”,意味着代码在解析时被解析和执行。在这种情况下,每次调用函数时都会解析并执行局部变量的声明,其中包含该变量声明。这不能称为“快速”。

但是,现代JavaScript处理引擎不再那样做;他们基本上是在网页加载时编译代码。局部变量的声明现在得到处理一次 - 与所有其他变量的声明一起,例如全局变量和对象属性。在这种情况下,对于编写代码更喜欢使用的人来说,可能没有最快的变量声明方式。

相关问题