जहां तक मैं कह सकता हूं, जेआईटी, केवल यह पता लगाएगा कि यह काफी सरल इनलाइन योग्य विधि है। ऐसा कहा जा रहा है कि प्रोग्रामर के लिए इन मामलों का पता लगाना बहुत आसान है और यह पता लगाने के लिए एक जेआईटी कंपाइलर के लिए एक कठिन समस्या है। अधिमानतः आपको final int
का उपयोग बड़े तरीकों से परिणामों को कैश करने के लिए करना चाहिए, क्योंकि जेआईटी आसानी से पता लगा सकता है कि मान बदल नहीं सकता है और लूप को गति देने के लिए सरणी एक्सेस चेक भी हटा सकता है।
कुछ की तरह
int[] arr = new int[ 10 ];
for(int i = 0; i < arr.length; i++) {
//...
}
या
List<String> list = Arrays.asList(new String[] { ... });
for(int i = 0; i < list.size(); i++) {
//...
}
शायद बहुत आसानी से JIT द्वारा अनुकूलित किया जा सकता है। अन्य लूप जो बड़ी या जटिल विधियों को कॉल करते हैं, हमेशा एक ही मूल्य को हमेशा साबित नहीं कर सकते हैं, लेकिन आकार() जैसी विधियों को शायद इनलाइन या पूरी तरह से हटाया जा सकता है।
अंत में सरणी पर प्रत्येक लूप के साथ। वे एरे के मामले में पोस्ट किए गए पहले लूप को क्षीण कर रहे हैं, और त्वरित लूप का उत्पादन करने के लिए आसानी से अनुकूलित किया जा सकता है। हालांकि गैर-सरणी पर प्रत्येक लूप के लिए, जब मैं त्वरित लूप की बात करता हूं तो इससे बचने के लिए पसंद करते हैं, क्योंकि वे इटरेटर लूप में क्षय हो जाते हैं और न कि दूसरे लूप को पोस्ट करते हैं। यह LinkedList के लिए सच नहीं है क्योंकि ओ (एन) ट्रैवर्सल के कारण प्राप्त() का उपयोग करने से एक इटरेटर तेज है।
यह सब अटकलें है कि जेआईटी एक लूप को अनुकूलित करने के लिए क्या कर सकता है। यह जानना महत्वपूर्ण है कि जेआईटी केवल कुछ ऐसा अनुकूलित करेगा जो साबित कर सकता है कि परिणामस्वरूप प्रभाव नहीं बदलेगा। चीजों को सरल रखने से जेआईटी की नौकरी बहुत आसान हो जाएगी। अंतिम कीवर्ड का उपयोग करने की तरह। मूल्यों पर या विधियों पर अंतिम उपयोग करने से जेआईटी आसानी से साबित हो सकता है कि वह नहीं बदलेगा और पागल की तरह इनलाइन कर सकता है। यह जेआईटी का सबसे महत्वपूर्ण अनुकूलन है, इनलाइनिंग। उस काम को आसान बनाएं और जेआईटी आपको एक बड़े तरीके से मदद करेगा।
यहाँ एक link पर चर्चा पाश अनुकूलन जहां JIT हमेशा एक पाश अनुकूलित नहीं कर सकते अगर यह यह अनुकूलन कुछ भी नहीं बदलेगा है साबित नहीं कर सकते है।
स्रोत
2014-08-28 03:17:12
आप 'int n = someMethod(); 'क्यों नहीं कर सकते और उसके बाद बाद में लूप में उपयोग करें? – Adi
मुझे लगता है कि http://stackoverflow.com/questions/6093537/for-loop-optimization इस प्रश्न का उत्तर देता है। – trooper
एडी, यह मूल रूप से मैंने अपने पहले उदाहरण में किया है। मेरा सवाल यह है कि पहली बार गणना करने के लिए जरूरी है। मुझे यकीन है कि ऐसे कुछ उदाहरण हैं जहां मैंने लिखा है कि दूसरा तरीका पहले जैसा ही माना जाता है, लेकिन मैं इसके बारे में गलत हो सकता हूं। –