2014-10-03 29 views
5

我一直在尋找一些JavaScript代碼,旨在運行在性能敏感的環境中,主要是遊戲引擎移動環境是否使用局部變量(而不是重複的屬性訪問)曾經傷害過性能?

在許多情況下,此代碼不使用局部變量,而是傾向於使用顯式鏈,例如,

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

在哪裏都this.x.ythis.x.y.z表示「複製」 - ,並且其中沒有中間特性的具有吸氣劑,並且其中q不是在別處使用的局部變量 - 可被處理語義上等同於以下內容。

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

(名字一直保持模糊的特別嘗試和減輕偏見,這個問題是不是該「模式」跟隨 - 雖然我更喜歡後者,並打算用它100%,因此在問這個問題。)

現在,在我收到有關「爲清晰度編寫代碼」和「不要過早優化」的評論之前,請繼續閱讀!

因此,考慮以下斷言/公理,並指出,這一問題是有關如何提高性能,而如果使用本地緩存/「別名」變量可以對相關的JavaScript實現下降性能:

  • 介紹一個局部變量,當多次訪問一個成員時,會導致更清晰的代碼。 (這是主觀的,但是爲了這個問題是一個公理。)
  • 對於非動態屬性使用局部變量,如圖所示,將始終具有相同的語義。
  • 通過局部變量創建閉包;因此不用擔心增加對象的生命週期或以其他方式保持較大的執行上下文範圍。
  • 重點是移動瀏覽器,包括非/低JIT品種 - 例如, JavaScriptCore和/或任何關於V8之前的Android。
  • 瀏覽器已經在這種情況下進行了很好的優化,預計不會使用局部變量會導致任何顯着的「性能」增加 - 這個問題是相反的。

能/會使用局部變量而不是[多]直接財產訪問結果的在性能下降?如果這種減少是「不可忽略的......」

+2

你回答這個問題的方式是通過測試。一般來說,緩存一個局部變量的值不會影響性能,並可能會改善它。 – 2014-10-06 05:08:33

回答

1

答案可能更多取決於瀏覽器而不是代碼。考慮到JavaScript被創建爲「解釋」,意味着代碼在解析時被解析和執行。在這種情況下,每次調用函數時都會解析並執行局部變量的聲明,其中包含該變量聲明。這不能稱爲「快速」。

但是,現代JavaScript處理引擎不再那樣做;他們基本上是在網頁加載時編譯代碼。局部變量的聲明現在得到處理一次 - 與所有其他變量的聲明一起,例如全局變量和對象屬性。在這種情況下,對於編寫代碼更喜歡使用的人來說,可能沒有最快的變量聲明方式。

相關問題