2017-02-19 28 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

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