使用局部变量(而不是重复的属性访问)是否会影响性能
Does using local variables (instead of repeated property access) ever hurt performance?
我一直在研究一些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%使用它,因此我提出了这个问题。)
现在,在我收到一大堆关于"为清晰编写代码"answers"不要过早优化"的评论之前,请继续阅读!
因此,给定以下断言/公理,并注意到这个问题不是关于如何提高性能的,而是如果使用本地缓存/"别名"变量可以降低相关JavaScript实现的性能:
- 当一个成员被多次访问时,引入一个局部变量将导致更清晰的代码。(这是主观的,但出于问题的考虑,这是一条公理。)
- 如图所示,为非动态属性使用局部变量将始终具有相同的语义
- 在局部变量上没有创建闭包;因此,不需要考虑增加对象寿命或以其他方式保持更大的执行上下文范围
- 重点是移动浏览器,包括非/低JIT变体,例如JavaScriptCore和/或V8之前Android上的任何内容
- 浏览器已经针对这种情况进行了很好的优化,预计使用局部变量不会导致任何明显的"性能"提高——这个问题恰恰相反
使用局部变量而不是[多个]直接属性访问的是否会导致性能下降?其中这种下降是"不可忽略的……"
答案可能更多地取决于浏览器而不是代码。假设JavaScript是被"解释"的,这意味着代码在被解析时被解析和执行。在这种情况下,每次调用包含变量声明的函数时,都会解析并执行局部变量的声明。这不能算"快"。
然而,现代JavaScript处理引擎不再以这种方式进行处理;它们本质上是在加载网页时编译代码。局部变量的声明现在只处理一次,同时处理所有其他变量的声明,如全局变量和对象属性。在这种情况下,对于编写代码的人来说,可能没有最快的变量声明方式。
相关文章:
- HTML5拖放访问属性
- 如何从保存在数组某个位置的JSON行访问属性
- webGL,javascript:尝试访问属性1中超出范围的顶点
- 访问属性的权限被拒绝'filepicker_comm_iframe'
- CanvasJS-访问变量-访问属性toString的权限被拒绝
- 错误:访问属性“”的权限被拒绝;文件”;
- 从javascript访问属性多端数组PHP
- 模块中的访问属性(CommonJS 样式)
- 从控制台 js 访问属性
- 相同的域,但仍收到“访问属性'文档'的权限被拒绝”
- 如何在 Javascript 中从函数本身或其副本访问属性
- 属性 Javascript 的访问属性
- 从 CoffeeScript 中类的属性中的方法访问属性的属性
- 通过 attrs.val 或 attrs.$set(attname, val)访问属性
- 使用 WinJS.Class 和访问属性
- Twitch TV API 访问属性名称值并更新它
- 如何访问属性名称中具有特殊字符的javascript对象的属性
- Cordova-不推荐尝试访问属性'userAgent'在非导航器对象上
- 具有私有方法的JS原型类不访问属性
- iFrame中的SelectionContext-访问属性“getSelection”的权限被拒绝