2013-03-11 80 views
6

根據ECMAScript規範,the unary logical NOT operator!)和the Boolean() function都使用the internal function ToBoolean(),並且NOT運算符還會執行一些檢查以反轉結果。那麼爲什麼雙重邏輯非運算much faster比運行Boolean()函數?爲什麼Boolean()在Javascript中很慢?

我用下面這段代碼來測試這是更快:

function logicalNotOperator() { 
    var start = performance.now(); 
    for (var i = 0; i < 9999999; i++) !!Math.random(); 
    return 0.001 * (performance.now() - start); 
} 
function booleanFunc() { 
    var start = performance.now(); 
    for (var i = 0; i < 9999999; i++) Boolean(Math.random()); 
    return 0.001 * (performance.now() - start); 
} 

注:我不是指new Boolean()構造,但Boolean()功能,它可以強制它給一個布爾參數。

+0

*「更快」* - 一些證據? – dfsq 2013-03-11 09:51:37

+0

布爾()或新的布爾()? – StarPinkER 2013-03-11 09:52:19

+1

'Boolean()'必須經歷爲每個調用創建一個新的執行上下文的花裏胡哨,其中'!! true'不會;我會*猜測*這是花費了很多時間的地方。 – Matt 2013-03-11 09:54:27

回答

6

雖然Boolean將調用函數(內部優化),最即時編譯器將內聯雙不使用XOR遠遠快(source code reference - JägerMonkey)。

和JSperf:http://jsperf.com/bool-vs-doublenot

+1

我對你的'異或'聲明有興趣(這並不意味着我不相信你,我只是想知道你從哪裏獲得這些信息)。 – Christoph 2013-03-11 09:57:03

+0

http://hg.mozilla.org/integration/mozilla-inbound/file/7c905a200bcc/js/src/methodjit/FastOps.cpp#1768(這是JägerMonkey - Spidmonkey的JavaScript methodjit) – Ven 2013-03-11 10:06:28

+0

好的,有趣的。你爲什麼使用這樣一個奇怪的測試設置。兩個無關的函數調用的開銷似乎削弱了測試結果的表現力。 – Christoph 2013-03-11 10:15:16