javascript 'let' और 'var' for-loops में




performance google-chrome (2)

जावास्क्रिप्ट में const प्रयोग को वापस करने के लिए कंक्रीट संख्याओं के लिए मेरी खोज पर, मैंने सभी तीन चर घोषणा प्रकारों var, let और const के बीच एक निष्पादन तुलना करने पर ठोकर खाई। मुझे परीक्षण सेटअप पसंद नहीं आया, इसलिए मैंने एक सरल बनाया।

मुझे उम्मीद नहीं थी कि फ़ायरफ़ॉक्स ने मेरी अपेक्षाओं को माप दिया है।

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

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

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

क्या हो रहा है? क्या यह एक बग है?

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


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


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

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

  fns.push(foo);

}

जब आप इसे babeljs के माध्यम से चलाते हैं तो आप देख सकते हैं कि यह पैदा होने वाले समकक्ष ES5 कोड में सही चर जीवों को बनाए रखने के लिए फ़ंक्शन कॉल शामिल है:

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

हालांकि, बैबल काफी बुद्धिमान है कि यदि आप ऐसा कुछ नहीं करते हैं जो लूप वैरिएबल के जीवनकाल को विस्तारित करने की आवश्यकता होती है तो यह सामान्य रूप से शरीर इनलाइन के साथ लूप के for सामान्य का उपयोग करता है। तो आपका कोड:

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

के बराबर होना दिखाया जा सकता है:

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

मेरा अनुमान होगा कि क्रोम में आंतरिक रूप से कुछ ऐसा ही होता है, लेकिन उन्होंने उन मामलों को अभी तक ऑप्टिमाइज़ नहीं किया है, जहां उन्हें लूप वैरिएबल को जीवित रखने की ज़रूरत नहीं है।

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






ecmascript-6