2013-03-11 10 views
6

ईसीएमएस्क्रिप्ट विनिर्देश के अनुसार, the unary logical NOT operator (!) और the Boolean() functionthe internal function ToBoolean() का उपयोग करें, और न ही ऑपरेटर परिणाम को उलट करने के लिए कुछ चेक भी करता है। तो Boolean() फ़ंक्शन चलाने से एक डबल लॉजिकल ऑपरेशन 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() समारोह है कि तर्क यह एक बूलियन करने के लिए दिया है coerces ।

+0

* "बहुत तेजी से" * - कुछ सबूत? – dfsq

+0

बूलियन() या नया बूलियन()? – StarPinkER

+1

'बूलियन()' को प्रत्येक कॉल के लिए एक नया निष्पादन संदर्भ बनाने की घंटी और सीटी के माध्यम से जाना है, जहां '!! सच' नहीं है; मैं * अनुमान लगाता हूं कि यह वह जगह है जहां समय के *** *** *** खर्च किए जाते हैं। – Matt

उत्तर

6

जबकि Boolean फ़ंक्शन (आंतरिक रूप से ऑप्टिमाइज़ किए गए) को कॉल करेगा, अधिकांश जेआईटी एक्सओआर का उपयोग नहीं करने वाले डबल को रेखांकित करेंगे जो बहुत तेज है (source code reference - जैगरमोन्की)।

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

+1

मुझे आपके 'एक्सओआर' दावे पर साक्ष्य में दिलचस्पी होगी (इसका मतलब यह नहीं है कि मैं आपको विश्वास नहीं करता हूं, मुझे यह जानना है कि आपको किस स्रोत से ऐसी जानकारी मिली है)। – Christoph

+0

http://hg.mozilla.org/integration/mozilla-inbound/file/7c905a200bcc/js/src/methodjit/FastOps.cpp#l768 (यह जैगरमोन्की के लिए है - स्पिडमोन्की की जावास्क्रिप्ट विधिजीत) – Ven

+0

ठीक है, दिलचस्प। आप इस तरह के एक अजीब परीक्षण सेटअप का उपयोग क्यों कर रहे हैं। दो असंबद्ध फ़ंक्शन कॉल का ओवरहेड परीक्षण परिणाम की अभिव्यक्ति को कमजोर करता है। – Christoph

संबंधित मुद्दे