9

ECMAScript 仕様によると、単項論理 NOT 演算子( !) と関数の両方がBoolean()内部関数ToBoolean()を使用し、NOT 演算子も結果を逆にするためにいくつかのチェックを行います。では、なぜ関数を実行するよりも二重の論理 NOT 演算の方がはるかに高速なのでしょうか?Boolean()

次のコードを使用して、どちらが高速かをテストしました。

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

var logicalNotOperatorResult = logicalNotOperator();
var booleanFuncResult = booleanFunc();
var diff = booleanFuncResult - logicalNotOperatorResult;

console.log('logicalNotOperator:', logicalNotOperatorResult);
console.log('booleanFunc:', booleanFuncResult);
console.log('diff:', diff);

注:私はnew Boolean()コンストラクターについて言及しているのではなくBoolean()、ブール値に与えられた引数を強制する関数について言及しています。

4

2 に答える 2

7

関数をBoolean呼び出しますが (内部的に最適化されます)、ほとんどの JIT は double をインライン化して XOR を使用しないようにします。これははるかに高速です (ソース コード リファレンス- JägerMonkey)。

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

于 2013-03-11T09:51:47.223 に答える