2013-10-08 6 views
9

का उपयोग reflection का उपयोग करने का प्रदर्शन भूमि के ऊपर के बारे में इस चर्चा में, यह कहा गया है:क्रम अनुकूलन किस तरह खो रहे हैं अगर हम प्रतिबिंब

प्रतिबिंब के

उपयोग पैदा कर सकता है कुछ क्रम अनुकूलन खो जाएं। उदाहरण के लिए, निम्न कोड की काफी संभावना है एक जावा आभासी मशीन द्वारा अनुकूलित है किया:

int x = 1; 
x = 2; 
x = 3; 

समतुल्य कोड Field.set * का उपयोग कर() नहीं हो सकता है।

प्रतिबिंब के बिना, जेवीएम द्वारा किस तरह के रनटाइम अनुकूलन किए जाएंगे?

+0

यह केवल 'x = 3' चलाएगा। जब आप मिश्रण में प्रतिबिंब फेंकते हैं तो सभी प्रकार की इनलाइनिंग चाल, ओपोड उन्मूलन इत्यादि दूर जाते हैं। –

+0

यह एक दिलचस्प सवाल है, लेकिन मुझे लगता है कि यह एक एकल SO प्रश्न के लिए बहुत व्यापक है। – chrylis

+0

एक्स के लिए असाइनमेंट कुछ भी नहीं करता है। यह एक स्थानीय चर है, कोई बहु-थ्रेड नहीं, कोई समरूपता नहीं है और इसे हटाया जा सकता है। यदि आप Field.set का उपयोग करते हैं तो अन्य थ्रेड में चर के लिए उपयोग हो सकता है ताकि इसे कभी अनुकूलित नहीं किया जा सके। मैं ऐसा सोचता हूं। –

उत्तर

0

बहुत सारे जेआईटी अनुकूलन नहीं किए जा सकते हैं। बस जेडीके स्रोत में देखें, प्रतिबिंब के माध्यम से फ़ील्ड वैल्यू सेट करना सुरक्षा जांच, और कुछ लुकअप शामिल है।

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

यदि आप इसे बेंचमार्क करते हैं, तो आप पाएंगे कि प्रतिबिंब "प्रत्यक्ष" कोड की तुलना में धीमी गति का क्रम है।

+1

क्या आप अपनी आखिरी लाइन पर विस्तार कर सकते हैं? आप 'परिमाण के क्रम' निष्कर्ष पर कैसे पहुंचे? – Victor

+0

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

+0

बस इसका परीक्षण करें। (1) एक सभ्य गर्मजोशी (> 10000 पुनरावृत्तियों) चलाएं ताकि जेआईटी अंदर आ जाए। लूप-इन-प्लेस-जटिंग फॉलसी से बचें। –

3

इस मामले में कोड को त्याग दिया जा सकता है क्योंकि यह कुछ भी नहीं प्रतीत होता है।

यदि आपने प्रतिबिंब का उपयोग किया है तो मुझे संदेह है कि यह अभी भी कुछ करेगा हालांकि आप प्रतिबिंब का उपयोग कर स्थानीय चर का उपयोग नहीं कर सकते हैं।

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