2013-03-11 10 views
6

Gemäß der ECMAScript-Spezifikation verwenden sowohl the unary logical NOT operator() als auch the Boolean() functionthe internal function ToBoolean(), und der NOT-Operator führt ebenfalls einige Überprüfungen durch, um das Ergebnis umzukehren. Also warum ist eine doppelte logische NICHT-Operation much faster als die Boolean() Funktion ausgeführt?Warum ist Boolean() in Javascript so langsam?

verwenden ich das folgende Stück Code zu testen, welche schneller war:

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); 
} 

Hinweis: Ich beziehe mich nicht auf den new Boolean() Konstruktor, aber die Boolean() Funktion, die das Argument zwingt es zu einer boolean gegeben hat .

+0

* "viel schneller" * - einige Beweise? – dfsq

+0

Boolean() oder neu Boolean()? – StarPinkER

+1

'Boolean()' muss durch den Schnickschnack gehen, um einen neuen Ausführungskontext für jeden Aufruf zu erstellen, wobei '!! Ich würde * raten *, dass hier eine *** Menge *** der Zeit verbracht wird. – Matt

Antwort

6

Während 10 die Funktion aufrufen wird (intern optimiert), werden die meisten JITs die Doppelverbindung verwenden, um kein XOR zu verwenden, das viel schneller ist (source code reference - JägerMonkey).

Und die JSperf: http://jsperf.com/bool-vs-doublenot

+1

Ich wäre an Beweisen für Ihre 'XOR'-Behauptung interessiert (das heißt nicht, dass ich Ihnen nicht glaube, ich möchte nur wissen, woher Sie solche Informationen erhalten haben). – Christoph

+0

http://hg.mozilla.org/integration/mozilla-inbound/file/7c905a200bcc/js/src/methodjit/FastOps.cpp#l768 (das ist für JägerMonkey - Spidmonkey's JavaScript-Methode) – Ven

+0

Okay, interessant. Warum benutzt du so ein seltsames Testsetup? Der Overhead von zwei nicht verwandten Funktionsaufrufen scheint die Aussagekraft des Testergebnisses zu schwächen. – Christoph