【问题标题】:Does using local variables (instead of repeated property access) ever hurt performance?使用局部变量(而不是重复的属性访问)是否会损害性能?
【发布时间】: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.ythis.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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多