2011-12-06 71 views
5

我一直在使用一些代碼從字符串中提取無符號的16位值。JavaScript - 在添加到String.prototype的函數的V8中性能很差?

我發現加入此功能的原型String

String.prototype.UInt16 = function(n) { 
    return this.charCodeAt(n) + 256 * this.charCodeAt(n + 1); 
}; 

不僅僅是有一個函數,它接受一個String作爲參數慢得多:

var UInt16 = function(s, n) { 
    return s.charCodeAt(n) + 256 * s.charCodeAt(n + 1); 
}; 

在Firefox中的區別只是兩個因素,但在Chrome 15中它是一百倍慢!

看到http://jsperf.com/string-to-uint16

結果任何人都可以毫無顧忌的說明這一點,和/或提供使用原型而不影響性能的另一種方式?

+3

http://groups.google.com/group/nodejs/browse_thread/thread/45d6dc32250c0ad3可能會說明一些問題。這有點令人沮喪。 –

+0

@CrescentFresh,看到我的回答,它仍然慢很多,並不像線程在使用對象時聲稱的那樣「在1%以內」。或者我可能會做錯了嗎? – Esailija

+0

@Esailija:我沒有看到你的回答與問題的關係。對測試用例的補充只是簡單地展示(正如谷歌小組討論所涵蓋的那樣),當調用該對象上的原型方法而不是調用原語中的相同方法時,保存對「String」對象的引用會產生更快的結果。 OP試圖解決的基本問題與將對象重複裝入對象時的隱式類型強制相關。 –

回答

1

從基元訪問原型(因爲它不是對象)比從對象訪問原型慢得多。

http://jsperf.com/string-to-uint16/2

10倍的鉻和2倍,在Firefox更快我更快。

使用原型時是否存在實際瓶頸?如果你不需要每秒數百萬次操作,它仍然非常快。如果你需要,那麼只需使用一個函數。

0

Alnitak,我做了一個快速jsperf test(我不小心發表),它表明,原型用戶類型不慢。在考慮像V8這樣的引擎是如何工作的時候,將代碼添加到內置對象時,Java編譯的表現會有很大不同。