1

在JavaScript中,我們假設我想從bObj中調用aObj.myMethod()。在我的應用程序中,從設計角度來看,aObj是bObj的基類。 JavaScript是一種晚期綁定語言,這意味着myMethod應該在運行時解決。是函數解析更快通過原型或直接引用可以更快地調用JavaScript函數嗎?

////////// IF

1 - 我與我的設計自然地去說bObj.prototype = aObj,然後在運行時我叫bObj.myMethod:

function bObj(){...}; 

bObj.prototype=aObj; 


//later 
var myBObj=new bObj(); 
myBObj.myMethod(); 
////////////////////////

OR

2-功能分辨率可以通過原型慢,所以我保持aObj作爲bObj中的一個屬性,並從bObj中調用aObj.myMethod()

function bObj() 
{ 
    this.myAObj=new aObj(); 
    ... 
}  

//later: 
var myBObj=new bObj(); 
myBObj.myAObj.myMethod(); 

我主要關心的是執行速度。在我的應用程序中,myMethod每秒被調用數百萬次。我知道大多數瀏覽器緩存指向最近調用函數的指針,所以在這兩種情況下,函數解析過程都會加速。然而,任何人都可以在這兩種情況下提供關於函數解析機制的更多細節,並讓我們瞭解哪種方法可能會更快?所有瀏覽器的解析機制是否相同,或者完全依賴於瀏覽器?

+7

*每秒*的百萬倍* *?哇,這真是太棒了! – 2011-04-05 00:15:30

+1

您是否嘗試過在不同瀏覽器中分析這兩種方式? – Cameron 2011-04-05 00:22:37

+2

您可以在http://jsperf.com/上設置您的兩個場景並自行測試 – 2011-04-05 00:23:39

回答

1

只要你引用你的方式是正確的,「功能分辨率可能會很慢」。 因此,讓我們來看看..

繼原chaing查找,如果你做myMethod的原型方法,如:aObj.prototype.myMethod =的someMethod,那麼第一種方式,myBObj.myMethod(),將獲得自從myBObj實例myMethod未設置以來,當它擊中繼承的原型方法時,在第二次嘗試中「解析命中」。第二種方法myBObj.myAObj.myMethod()在第二次嘗試擊中原型方法時將得到'解析命中',因爲再一次沒有設置實例方法(myAObj = new aObj()不設置myAObj.myMethod尚未將設置myAObj.prototype.myMethod, 所以,你這樣做的方式,沒有任何區別。

從任你這樣做 方式獲得的性能增益要麼確保你要調用實例方法設置,然後引用它:

bObj.myMethod=bObj.prototype.myMethod; 
bObj.myMethod(); 

myAObj.myMethod=myAObj.prototype.myMethod; 
bObj.myMethod(); 
在這兩種情況下

第一查找獲取實例方法,它的使用哪個更好。

爲了獲得最佳的性能增益,完全消除了查找 並引用原型方法:

myBobj.prototype.myMethod(); 

myBObj.myAObj.prototype.myMethod(); 

沒有「函數解析」,在這些後兩種情況需要。

儘管我們都知道每次使用函數函數時都會被解釋,並且已聲明的函數被編譯(解釋)一次,並且速度如此之快,但如果將聲明的函數設置爲對象的原型實際上會使其更加神祕執行得更快。

如果你能找到這個,那麼你會確切地知道如何讓一個功能,任何功能, 執行在它的速度最快:聲明它或將其設置爲原型功能,無論是最好的,如果有的話,如果原型方法更快,通過直接引用原型方法避免任何原始鏈查找。

0

我剛剛完成了這個特定情況下的幾個性能測試。它在Mozilla Rhino 1.7R3上以優化模式運行。

你的問題實際上是關於財產查詢。一旦在可用範圍鏈中找到一個屬性(在您的情況下,具有函數值),則進一步的操作在兩種情況下都會以相同的方式執行。

顯而易見的結果是,在原型上定義的函數查找速度較慢。平均來說,調用一個原型函數花費了35%的時間。直接調用本地函數和直接調用全局範圍內的函數的結果相同。

自己的屬性解析速度更快,因爲它們的範圍在原型之前。

做出您的決定。請記住,原型非常適合代碼維護和對象重用。

相關問題