2017-02-19 40 views
0

是否值得在变量中保存this.key的值?this.key vs变量表现

假设我必须每帧都做这个操作,会对速度产生影响吗?

简单的例子:

class Vector3 { 
    constructor(X = 0, Y = 0, Z = 0) { 
     this.X = X 
     this.Y = Y 
     this.Z = Z 
    } 
    toVector2() { 
     return new Vector2(
      (this.Y - this.X) * COS27, 
      -((this.Y + this.X) * SIN27 + this.Z) 
     ) 
    } 
} 

VS

class Vector3 { 
    constructor(X = 0, Y = 0, Z = 0) { 
     this.X = X 
     this.Y = Y 
     this.Z = Z 
    } 
    toVector2() { 
     const {X, Y, Z} = this 
     return new Vector2(
      (Y - X) * COS27, 
      -((Y + X) * SIN27 + Z) 
     ) 
    } 
} 

当中哪些是更有效率?垃圾回收可以影响性能吗?

+0

在jsperf中编写一个测试用例,并亲自查看。 – sabithpocker

+1

性能差异如此轻微,可以忽略不计。它可以归结为代码可读性和维护。在大型项目中,只要不会极大地影响代码可读性,我就会追求最小的优化。但从理论上讲,它确实会以一种无法察觉的方式影响性能。 –

+0

在大多数浏览器/转发器中,ES6解构赋值仍然比直接属性访问更慢(高达100倍),请参见[six-speed](https://kpdecker.github.io/six-speed/)。 – wOxxOm

回答

1

其他答案根本上是错误的,因为他们忽略引擎完成的优化。如果需要,现代引擎通常会缓存this.X,以便进一步的访问不涉及查找。甚至有可能引擎可以在缓存中执行比自己更好的作业,因为它不需要额外的本地变量被放入堆栈并从堆栈中弹出。

其他答案也是错误的,因为他们没有指出任何性能上的差异,只要它存在,就会在亚微秒范围内。

其他答案也是错误的,因为他们没有指出,如果发现通过对应用程序进行基准测试发现有必要进行优化,则应该进行优化。

在第二种情况下声明局部变量的唯一原因是出于可读性和清晰度的目的。

2

这是非常微观的优化,除非您在物业访问时遇到性能瓶颈。但是只要看看发生了什么:

1)直接访问属性:

当你反复的任何对象访问属性,你会看这些属性起来状结构的哈希表(这是快速),但是如果在整个原型链(可能不是那么快)中找到(可能)。

2)分配给当地人:

当分配给本地变量,你做的查询一次,工作,后来在局部范围内的变量,这是(应该是)更快。

结论:

第二个选项是更“高效”,如果对你很重要,在我看来更可读。此外,如果您反复访问相同的属性,将它们保存在本地是有意义的 - 摆脱一堆重复,并且使用解构语法看起来真的很愉快。

+0

感谢您的解释:),它也更适合我。我甚至忘记了整个原型链,现在我绝对相信我应该将这些值存储在变量中 –

+0

@MaciejKozieja解构是在我看来发生在js上的最好的事情之一。如果您有兴趣,请查看它的所有用途!它使传递的配置对象更加清洁! –

+0

我知道它,我在代码中使用它 –