使用局部变量(而不是重复的属性访问)是否会影响性能

Does using local variables (instead of repeated property access) ever hurt performance?

本文关键字:访问 属性 是否 性能 影响 局部变量      更新时间:2023-09-26

我一直在研究一些JavaScript代码,这些代码设计用于在性能敏感的环境中运行,主要是移动环境中的游戏引擎。

在许多情况下,该代码不使用局部变量,而是更喜欢使用显式链,例如

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

其中this.x.ythis.x.y.z都表示"重复",并且中间属性都没有getter,并且q是其他地方没有使用的局部变量,可以在语义上等效于以下内容。

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

(名称一直保持模糊,特别是为了试图减轻偏见;这个问题不是关于遵循哪种"模式"——尽管我确实更喜欢后者,并打算100%使用它,因此我提出了这个问题。)

现在,在我收到一大堆关于"为清晰编写代码"answers"不要过早优化"的评论之前,请继续阅读!

因此,给定以下断言/公理,并注意到这个问题不是关于如何提高性能的,而是如果使用本地缓存/"别名"变量可以降低相关JavaScript实现的性能:

  • 当一个成员被多次访问时,引入一个局部变量将导致更清晰的代码。(这是主观的,但出于问题的考虑,这是一条公理。)
  • 如图所示,为非动态属性使用局部变量将始终具有相同的语义
  • 在局部变量上没有创建闭包;因此,不需要考虑增加对象寿命或以其他方式保持更大的执行上下文范围
  • 重点是移动浏览器,包括非/低JIT变体,例如JavaScriptCore和/或V8之前Android上的任何内容
  • 浏览器已经针对这种情况进行了很好的优化,预计使用局部变量不会导致任何明显的"性能"提高——这个问题恰恰相反

使用局部变量而不是[多个]直接属性访问的是否会导致性能下降?其中这种下降是"不可忽略的……"

答案可能更多地取决于浏览器而不是代码。假设JavaScript是被"解释"的,这意味着代码在被解析时被解析和执行。在这种情况下,每次调用包含变量声明的函数时,都会解析并执行局部变量的声明。这不能算"快"。

然而,现代JavaScript处理引擎不再以这种方式进行处理;它们本质上是在加载网页时编译代码。局部变量的声明现在只处理一次,同时处理所有其他变量的声明,如全局变量和对象属性。在这种情况下,对于编写代码的人来说,可能没有最快的变量声明方式。