我一直在尋找一些JavaScript代碼,旨在運行在性能敏感的環境中,主要是遊戲引擎移動環境。是否使用局部變量(而不是重複的屬性訪問)曾經傷害過性能?
在許多情況下,此代碼不使用局部變量,而是傾向於使用顯式鏈,例如,
if (this.x.y[z].i) {
this.x.y[z].a += this.x.y[z].b;
}
在哪裏都this.x.y
和this.x.y.z
表示「複製」 - ,並且其中沒有中間特性的具有吸氣劑,並且其中q
不是在別處使用的局部變量 - 可被處理語義上等同於以下內容。
var q = this.x.y[z]
if (q.i) {
q.a += q.b;
}
(名字一直保持模糊的特別嘗試和減輕偏見,這個問題是不是該「模式」跟隨 - 雖然我更喜歡後者,並打算用它100%,因此在問這個問題。)
現在,在我收到有關「爲清晰度編寫代碼」和「不要過早優化」的評論之前,請繼續閱讀!
因此,考慮以下斷言/公理,並指出,這一問題是不有關如何提高性能,而如果使用本地緩存/「別名」變量可以對相關的JavaScript實現下降性能:
- 介紹一個局部變量,當多次訪問一個成員時,會導致更清晰的代碼。 (這是主觀的,但是爲了這個問題是一個公理。)
- 對於非動態屬性使用局部變量,如圖所示,將始終具有相同的語義。
- 有否通過局部變量創建閉包;因此不用擔心增加對象的生命週期或以其他方式保持較大的執行上下文範圍。
- 重點是移動瀏覽器,包括非/低JIT品種 - 例如, JavaScriptCore和/或任何關於V8之前的Android。
- 瀏覽器已經在這種情況下進行了很好的優化,預計不會使用局部變量會導致任何顯着的「性能」增加 - 這個問題是相反的。
能/會使用局部變量而不是[多]直接財產訪問結果的在性能下降?如果這種減少是「不可忽略的......」
你回答這個問題的方式是通過測試。一般來說,緩存一個局部變量的值不會影響性能,並可能會改善它。 – 2014-10-06 05:08:33