2013-03-11 4 views
6

ECMAScript 사양에 따르면 the unary logical NOT operator (!) 및 the Boolean() functionthe internal function ToBoolean()을 사용하고 NOT 연산자는 결과를 역으로하기 위해 몇 가지 검사를 수행합니다. 그렇다면 Boolean() 함수를 실행하는 것보다 double 논리 NOT 연산 much faster은 왜 발생합니까? 자바 스크립트에서 부울()이 느린 이유는 무엇입니까?

나는이었다 테스트하기 위해 다음 코드 조각을 사용 속도 :

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

+0

부울() 또는 새 부울()? – StarPinkER

+1

'Boolean()'은 각 호출에 대한 새로운 실행 컨텍스트를 생성하는 종소리와 호루라기를 거쳐야합니다. 여기서'!! true'는 그렇지 않습니다; 나는 *** 시간 ***이 많이 소비 된 곳이라고 생각합니다. – 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

좋아요, 재미 있습니다. 왜 이상한 테스트 설정을 사용하고 있습니까? 관련이없는 두 개의 함수 호출의 오버 헤드는 테스트 결과의 표현력을 약화시키는 것처럼 보입니다. – Christoph

관련 문제