2016-07-26 35 views
0
function Obj() 
{ 
    this.prop = { a: 1, b: 2 }; 

    this.access(); 
    access(this.prop); 
} 

Obj.prototype.access = function() 
{ 
    // accessing 'this.prop' directly 
} 

function access(property) 
{ 
    // accessing 'this.prop' through local reference 'property' 
} 

多少性能命中的訪問時Obj.prop間接地通過一個對象引用(如在全球access()函數看出)與直接(如在Objaccess()方法可見)招致,爲什麼?Javascript - 通過引用訪問對象是否會導致性能下降?

+0

你的兩種情況沒有區別。無論是「this」還是「foo」,你仍然在做'x.y'。 – ssube

+0

@ssube我的理解如下,並在以下頁面進一步解釋:http://gameprogrammingpatterns.com/data-locality.html - 參考指向內存中某個任意位置的數據。間接訪問數據幾乎總是會產生「緩存未命中」,因爲它與本地數據不相連。其結果是CPU在等待數據被檢索時停頓,這導致性能下降。這也適用於Javascript嗎,還是有優化到位? – sookie

+0

@sookie:這種優化是完成的,如果有的話,只能由JavaScript中的編譯器/解釋器完成。但是,不,總是有相同數量的參考查找,無論您是否使用中間變量,所以它沒有區別。當你重複它們時,緩存(無論是在編譯的代碼還是在CPU本身)都會照顧到這一點。 – Bergi

回答

0

沒有,真的。

var p = obj.prop 
p.a 

obj.prop.a 

是完全等價的,局部變量可以被優化的。在功能調用(access(this.prop))的情況下,該參數可能無法優化,直到函數被內聯,但仍然幾乎沒有任何差異。

如果多次訪問p而不是多次訪問obj.prop可能會有所幫助,但即使是在現代引擎中也可以優化。

任何性能差異都可以忽略不計。但是,JavaScript並不是一種語言,無論如何你都會進行這種微觀優化 - 如果你編寫標準代碼,引擎會優化它。

相關問題