簡體   English   中英

使用局部變量(而不是重復的屬性訪問)是否會損害性能?

[英]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.xythis.xyz表示“重復” - 並且其中沒有任何中間屬性具有getter,並且q是其他地方未使用的局部變量 - 可以在語義上等同於以下處理。

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

(名稱一直模糊不清,特別是試圖減輕偏見;這個問題並不是關於要采用哪種“模式” - 雖然我更喜歡后者,並打算100%使用它,因此我在問這個問題。)

現在,在我收到大量關於“為清晰度編寫代碼”和“不要過早優化”的評論之前,請繼續閱讀!

因此,給出以下斷言/公理並注意到這個問題不是關於如何提高性能,而是如果使用本地緩存/“別名”變量會降低相關JavaScript實現的性能:

  • 引入局部變量,當多次訪問成員時,將導致更清晰的代碼。 (這是主觀的,但為了這個問題,這是一個公理。)
  • 如圖所示,對於非動態屬性使用局部變量將始終具有相同的語義。
  • 在局部變量上沒有創建閉包; 因此,不用擔心增加對象生存期或以其他方式保持更大的執行上下文范圍。
  • 專注於移動瀏覽器,包括非/低JIT品種 - 例如JavaScriptCore和/或V8之前Android上的任何內容。
  • 瀏覽器已經針對這種情況進行了很好的優化,並且預計使用局部變量不會導致任何明顯的“性能”增加 - 這個問題恰恰相反。

可以/將使用局部變量而不是 [多個]直接屬性訪問導致性能下降嗎? 如果這種下降是“不可忽視的......”

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM