2013-03-11 21 views
6

, the unary logical NOT operator (!) ve the Boolean() function kullanımı the internal function ToBoolean() ve NOT Operatör aynı zamanda İşlemi tersine çevirmek için birkaç kontroller yapar hem. Öyleyse neden Boolean() işlevini çalıştırmaktansa çift mantıklı bir NOT much faster işlemi? Neden Boole() çok yavaş Javascript'tedir? ECMAScript patent açıklamasına göre

Ben hangi test etmek için aşağıdaki kod parçasını kullanılan hızlı:

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

Not: Ben new Boolean() yapıcı atıfta değilim, ama bir mantıksal değere verdi argüman coerces Boolean() işlevi .

+0

* "çok daha hızlı" * - Bazı kanıt? – dfsq

+0

Boolean() veya yeni Boolean()? – StarPinkER

+1

'Boolean()', her çağrı için yeni bir yürütme bağlamı yaratmanın zillerini ve çırpışlarını incelemelidir; Tahmin ederim ki * bu zamanın bir *** lotunun harcanmış olduğu yer. – Matt

cevap

6

Boolean işlevi (dahili olarak en iyi duruma getirilmiş) işlevi çağırırken, çoğu JIT çok daha hızlı olan (source code reference - JägerMonkey) XOR'u kullanmamanın çiftini satır içi gösterecektir.

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

+1

“XOR” iddianızın kanıtları ile ilgilenirim (bu size inanmıyorum anlamına gelmez, sadece hangi kaynaklardan hangi bilgileri aldığınızı bilmek isterim). – Christoph

+0

http://hg.mozilla.org/integration/mozilla-inbound/file/7c905a200bcc/js/src/methodjit/FastOps.cpp#l768 (bu JägerMonkey için - Spidmonkey'in JavaScript methodjit'i) – Ven

+0

Tamam, ilginç. Neden böyle garip bir test kurulumu kullanıyorsun? İki ilgisiz fonksiyon çağrısının yükü, test sonucunun ifadesini zayıflatıyor gibi görünmektedir. – Christoph