लेखक मानते हैं कि परिवर्तनीय done
एक स्थानीय चर है, जिसमें जावा मेमोरी मॉडल में सिंक्रनाइज़ेशन प्राइमेटिव के बिना अन्य धागे के मूल्य को बेनकाब करने के लिए कोई आवश्यकता नहीं है। या एक और तरीका कहा: done
का मूल्य यहां दिखाए गए किसी भी अन्य कोड से बदला या देखा नहीं जाएगा।
उस स्थिति में, चूंकि लूप done
के मान को नहीं बदलता है, इसलिए इसका मूल्य प्रभावी रूप से अनदेखा किया जा सकता है, और संकलक लूप के बाहर उस चर के मूल्यांकन को बढ़ा सकता है, इसे "गर्म" में मूल्यांकन करने से रोकता है "लूप का हिस्सा। इससे लूप तेजी से चलता है क्योंकि इसे कम काम करना पड़ता है।
इस तरह के एक सरणी की लंबाई के रूप में भी और अधिक जटिल भाव में काम करता है,:
int[] array = new int[10000];
for (int i = 0; i < array.length; ++i) {
array[i] = Random.nextInt();
}
इस मामले में, भोली कार्यान्वयन सरणी की लंबाई 10,000 गुना का मूल्यांकन होता है, लेकिन जब से चर सरणी है कभी नहीं सौंपा और सरणी कभी नहीं बदलेगा की लंबाई, मूल्यांकन बदल सकते हैं:
int[] array = new int[10000];
for (int i = 0, $l = array.length; i < $l; ++i) {
array[i] = Random.nextInt();
}
अन्य अनुकूलन भी यहाँ उत्थापन से संबंधित नहीं लागू होते हैं।
उम्मीद है कि मदद करता है।
मुझे यह नहीं मिला है, अगर लूप समाप्त हो जाए, तो स्थिति हमेशा सच होती है? –
मेरा मानना है कि ईजे के बिंदु के लेखक यह है कि क्योंकि जेआईटी कंपाइलर * इस तरह अनुकूलित कर सकता है, एक प्रोग्रामर को एक अलग थ्रेड से 'किए गए' के मूल्य पर निर्भर नहीं होना चाहिए। यह संभव है कि जेआईटी कंपाइलर इस निर्माण के लिए कोड को अनुकूलित कर सके और फिर लूप वास्तव में कभी समाप्त नहीं होगा। – ahawtho
यह अनुकूलन तब भी हो सकता है जब 'किया' एक उदाहरण या वर्ग चर है, जब तक यह अस्थिर नहीं है। – assylias