2013-03-11 10 views
6

ECMAScript仕様によると、the unary logical NOT operator!)とthe Boolean() functionthe internal function ToBoolean()を使用し、NOT演算子も結果を逆転させるためにいくつかのチェックを行います。だから、なぜ二重論理NOT操作much fasterBoolean()機能を実行するよりもですか?なぜブール値()が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型に与えられています、引数を強制変換Boolean()機能ではないのです。

+0

*「はるかに高速」* - 何らかの証拠? – dfsq

+0

ブール()または新しいブール()? – StarPinkER

+1

'Boolean()'は呼び出しごとに新しい実行コンテキストを作成するという鐘や笛を通らなければなりません。私は*これは***ロット***の時間が費やされている場所だと推測します。 – Matt

答えて

6

Booleanは(内部最適化された)関数を呼び出しますが、ほとんどのJITはXORを使用しないで倍精度化します(source code reference - JägerMonkey)。

そして、JSperf:http://jsperf.com/bool-vs-doublenot

+1

私はXORの主張に関する証拠に興味があります(これは私があなたを信じないという意味ではなく、私はあなたがそのような情報を入手したソースを知りたいのです)。 – Christoph

+0

http://hg.mozilla.org/integration/mozilla-inbound/file/7c905a200bcc/js/src/methodjit/FastOps.cpp#l768(これはJägerMonkeyのためのものです - SpidmonkeyのJavaScriptメソッド) – Ven

+0

よろしくお願いします。なぜあなたはそのような奇妙なテスト設定を使用していますか?関連のない2つの関数呼び出しのオーバーヘッドは、テスト結果の表現力を弱めるようです。 – Christoph

関連する問題