2017-05-08 10 views
10

जावास्क्रिप्ट में const कीवर्ड के पीछे उपयोग के लिए ठोस संख्याओं की खोज पर, मैंने सभी तीन परिवर्तनीय घोषणा प्रकारों var, let और const के बीच प्रदर्शन तुलना पर ठोकर खाई। मुझे परीक्षण सेटअप पसंद नहीं आया, इसलिए मैंने a simplified one बनाया।जावास्क्रिप्ट 'लेट' और 'var' फॉर-लूप

मैं बहुत अंतर उम्मीद नहीं थी और Firefox मेरी उम्मीदों पर खरा मापा:

jsPerf results on Firefox 52

लेकिन क्रोमियम कुछ अजीब में हुआ:

jsPerf results on Chrome 57

इतना ही नहीं सभी परीक्षण के परिणाम हैं लूप के अंदर काफी कम लेकिन let गति के एक अंश तक टूट जाता है।

मैंने यह सुनिश्चित करने के लिए ब्राउज़रस्टैक में परीक्षण चलाने का फैसला किया है कि यह मेरा क्विर्की लिनक्स सेटअप नहीं है। विंडोज 10 पर Firefox 53 और Chrome 58 के साथ ऐसा ही होता है। मैंने कुछ हद तक पुराने Chrome 50 का परीक्षण किया और वही व्यवहार प्राप्त किया।

क्या चल रहा है? क्या यह एक बग है?

संपादित करें: कुछ ने टिप्पणी की कि लूप शायद कुछ भी नहीं कर रहा है क्योंकि यह कुछ भी नहीं कर रहा है। दिखाने के लिए, यह मामला नहीं है, मैंने the test बदल दिया।

+0

क्या आप वाकई फ़ायरफ़ॉक्स को कोड को अनुकूलित नहीं कर रहे हैं?वास्तव में उन कोड ब्लॉक में से कोई भी * कुछ * ऐसा नहीं कर सकता है क्योंकि वे गति में समान हैं। – CodingIntrigue

+0

_ "मैंने एक सरलीकृत बनाया है।" _ आपने अनिवार्य रूप से पूरे परीक्षण को हटा दिया है। आपने एक लूप बनाया जो कुछ भी नहीं करता है और इसलिए इसे अनुकूलित किया जाता है। "अंदर आने दें" के दुष्प्रभाव भी नहीं हैं, यही कारण है कि यह "सबसे तेज़" है। क्रोम का इंजन इस विशेष मामले को अनुकूलित करने के लिए प्रतीत नहीं होता है। – zeroflagL

+0

@CodingIntrigue: मैं इस बारे में सोचा है, लेकिन एक खाली पाश में काफी अधिक संख्या (18 मेरी मशीन पर लाख के आसपास) में परिणाम होगा चल रहा है। की – koehr

उत्तर

0

ऐसा इसलिए है क्योंकि चलिए कीवर्ड विनिर्देश के लिए कुछ नया है और केवल स्थानीय दायरे पर लागू होता है। क्रोम में यह अभी तक अनुकूलित नहीं प्रतीत होता है, लेकिन यह केवल समय की बात होनी चाहिए।

+0

दिलचस्प बात यह है इस अन्य ब्राउज़रों में से किसी में नहीं होता है, न सफारी में, और न ही एज में। संपादित करें: लेकिन - के रूप में उम्मीद - ओपेरा, जो क्रोम के रूप में ही इंजन का उपयोग करता है। – koehr

2

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

var sum = 0; 
var fns = []; 

var _loop = function _loop(i) { 
    function foo() { 
    sum += i; 
    } 

    fns.push(foo); 
}; 

for (var i = 0; i < 1000; i++) { 
    _loop(i); 
} 

हालांकि:

let sum = 0; 
let fns = []; 
for (let i=0; i < 1000; i++) { 
    function foo() { sum += i; } 

    fns.push(foo); 

} 

आप देख सकते हैं जब आप इसे babeljs माध्यम से चलाने के बराबर ES5 कोड यह पैदा करता है आदेश सही चर जीवन काल को संरक्षित करने में एक समारोह कॉल में शामिल हैं: उदाहरण के लिए इस कोड पर विचार बेबेल इतना बुद्धिमान है कि यदि आप कुछ भी नहीं करते हैं जिसके लिए लूप वैरिएबल के जीवनकाल को विस्तारित करने की आवश्यकता होती है तो यह शरीर की इनलाइन के साथ साधारण for लूप का उपयोग करता है। तो अपने कोड:

for (let i=0; i < 1000; i++) { 
    true; 
} 

बिल्कुल के बराबर होना दिखाया जा सकता है: हो सकता है कि बहुत कुछ इसी तरह क्रोम में आंतरिक रूप से होता है

for (var i=0; i < 1000; i++) { 
    true; 
} 

मेरा अनुमान है, लेकिन वे अभी तक मामलों बाहर अनुकूल नहीं है जहां उन्हें लूप परिवर्तनीय को जीवित रखने की आवश्यकता नहीं है।

यह देखना दिलचस्प होगा कि इस उदाहरण के शीर्ष पर मैंने जो कोड इस्तेमाल किया था, वह फ़ायरफ़ॉक्स और क्रोम में तुलना करता है क्योंकि मुझे संदेह है कि उन्हें दोनों धीमी गति से समाप्त होना चाहिए। आपको खाली लूप जैसे समय की चीजों से सावधान रहना चाहिए क्योंकि परिणाम वास्तविक कोड के लिए सामान्य से कहीं अधिक अनुकूलन द्वारा छोड़े जा सकते हैं।

+1

* "मेरा अनुमान होगा" * - विश्वसनीय स्रोत। –

+0

जेएसपीआरएफ में एक संपादन बटन है। आप इस संस्करण को किसी भी समय एक नए संशोधन में जोड़ सकते हैं। मुझे दिलचस्पी है कि यह कैसे हो सकता है कि क्रोम एकमात्र ऐसा ब्राउज़र है जिसने इसे अनुकूलित नहीं किया है। – koehr

+1

@ किंडुसर धन्यवाद लेकिन मुझे लगता है कि मेरे अनुमान आमतौर पर बहुत विश्वसनीय हैं। कम से कम इंटरनेट पर कुछ भी विश्वसनीय के रूप में। मैंने जो किया है उसे प्रश्न का एक प्रस्तावित उत्तर दिया गया है। कोई और संदर्भ उन संदर्भों को उद्धृत करने के लिए स्वतंत्र है जो या तो मेरे उत्तर का समर्थन करते हैं या अस्वीकार करते हैं और यदि वे करते हैं तो मैं अपना उत्तर अपडेट करता हूं या तदनुसार इसे हटा देता हूं। – Duncan

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