2015-09-19 7 views
7

इस कोड पर अलग बर्ताव करता है:क्यों इस कोड को विभिन्न मूल्यों

var i = 10000000000; 
do { 
    i--; 
} 
while (i !== 0); 
//Result: 38 second. 

var i = 10000000000; 
do {} 
while (i-- !== 0); 
//Result: 27 second. 
//(same result with while (i--) 

var i = 10000000000; 
do {} 
while (i-- | 0); 
//Result: 13.5 second. 

सवाल यह है: क्यों इन संस्करण मैं के छोटे मूल्य के लिए एक ही समय मिलता है? अगर मैं एक से शून्य शून्य कटौती; सभी संस्करणों को 2.2 सेकंड की आवश्यकता है। (जेआईटी अनुकूलन के बाद भी परीक्षण किया गया - केवल वी 8 में)

यह तार्किक लगता है कि तीसरा संस्करण हमेशा तेज़ होना चाहिए, लेकिन यह केवल बहुत अधिक मूल्यों के लिए तेज़ है।

यह सिर्फ एक जिज्ञासा है ... वास्तव में महत्वपूर्ण नहीं है।

+0

मैंने इन्हें jsperf में डालने की कोशिश की लेकिन यह मेरे ब्राउज़र को http://jsperf.com/do-while-speed-test को दुर्घटनाग्रस्त कर देता है। ध्यान रखें कि अलग-अलग जावास्क्रिप्ट इंजन अलग-अलग परिणामों का परिणाम देंगे, क्योंकि वे अलग-अलग चीजों को प्राथमिकता देते हैं। यह अंतर्निहित ओएस के हैंडलिंग नंबरों के तरीके के रूप में कुछ आसान हो सकता है। (अद्यतन: परीक्षण चला गया है लेकिन जेएसपीआरएफ अपनी खुद की 'नाम' संपत्ति खोने के बारे में एक त्रुटि फेंक रहा है। कोई विचार नहीं कि ऐसा क्यों हुआ) – somethinghere

+4

आखिरी वाला सबसे तेज़ है क्योंकि यह केवल 1410065408 बार पुनरावृत्त करता है और वास्तव में दूसरे की गति 1/3 है संस्करण, यानी 1044492 9 0 प्रति सेकंड बनाम 370370370 प्रति सेकेंड –

+0

अच्छा अवलोकन। यह नहीं देखा था। –

उत्तर

0

प्रोसेसर, परिचालन प्रणाली, और दुभाषिया आपके प्रोग्राम की गति में हस्तक्षेप कर सकता है जिसकी भविष्यवाणी करना मुश्किल है। यही कारण है कि बड़े ओह नोटेशन का उपयोग एल्गोरिदम का मूल्यांकन करने के लिए किया जाता है।

गति अलग-अलग हो सकती है, इसका कारण यह है कि एक कम शून्य के साथ i का आपका मूल्य केवल 32 बिट्स का उपयोग करके व्यक्त किया जा सकता है। तो दुभाषिया द्वारा उत्पन्न असेंबली कोड ऑप्टिमाइज़ेशन कर सकता है और 32 बिट्स पूर्णांक के निर्देशों का उपयोग कर सकता है।

अंतिम कोड में i का मान भी 32 बिट पूर्णांक में पुनरावृत्तियों की संख्या को बदलने के रूप में परिवर्तित किया जाता है, और यही वजह है कि यह i के मान को केवल 32 बिट्स का उपयोग करके व्यक्त नहीं किया जा सकता है।

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