簡體   English   中英

crockford的JavaScript構造函數模式真的應該更快嗎?

[英]Is crockford's JavaScript constructor pattern really supposed to be faster?

我最近嘗試為經常創建的值對象優化一些代碼。 (三維向量,fwiw)

我嘗試過的一件事是將構造函數從匿名方法工廠模式轉換為普通的JavaScript構造函數。

這導致嚴重的性能損失讓我感到驚訝,因為在我關於JavaScript構造函數/工廠模式主題的上一個問題中 ,建議使用'new'和普通構造函數。

很可能是我的測試過於簡單,或者只是完全錯誤,或者是最近在chrome的JavaScript引擎或上述所有內容中進行性能優化的結果。 無論如何,我真的很想知道為什么我的'優化'導致性能下降 - 而且 - 最重要的是:我的jsperf testrun有沒有明顯的問題?

您的測試之間的主要區別是:

  • {}new Object ,這表明new比使用{}慢。 []new Array也是如此。)

  • 您的測試會產生不同的結果: make工廠函數的結果不是Make對象。 構造的Make有一個原型,由所有Make對象共享。 您的工廠函數的結果只是一個裸Object ,並且在其原型鏈( Object.prototype )中有一個原型,而Make構造的對象有兩個( Make.prototype ,后跟Object.prototype )。

    我使用非標准的__proto__屬性實現了一個實際返回Make對象(而不是簡單的Object )的工廠函數的測試分支 ,它比使用構造函數慢得多。 IE不支持__proto__ ,但Firefox和Chrome的結果看起來非常明確。

構造函數優化的一個方面是共享屬性,通常是方法。 如果許多對象使用與方法相同的函數,或者共享其他命名屬性,那么對原型的一個賦值將在從構造函數創建的所有對象中共享該屬性的單個實例,從而減少內存開銷,並且不需要重復為每個創建的對象分配每個這樣的屬性,減少了構建時間開銷。

由於您的樣本不包含任何此類屬性,因此您不會看到此類好處。 但是,如果您的生產代碼不包含構造對象的共享屬性,則可能沒有理由切換到構造函數。

所以,如果,例如你有代碼這樣的

function make(p) {
    return {
        parm: p,
        addTwo: function() {return this.parm + 2;},
        double: function() {return this.parm * 2;},
        square: function() {return this.parm * this.parm;}
    };
};

它可能比這更慢:

function Make(p) {
    this.parm = p;
}
Make.prototype.addTwo = function() {return this.parm + 2;};
Make.prototype.double = function() {return this.parm * 2;}
Make.prototype.square = function() {return this.parm * this.parm;}

如果您創建許多實例,它還會占用更多內存。

暫無
暫無

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

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