2013-08-13 8 views
6

हाल ही में मैंने जावा की दक्षता पर चर्चा में हिस्सा लिया। जैसा कि मैंने सुना, जावा के खिलाफ बहुत सारे तर्क थे कि व्याख्या करना "बेहद समय लेने वाला" है और इसके कारण भी सरल जावा प्रोग्राम समान रूप से मशीन कोड पर संकलित किए गए तरीके से धीमा हो जाते हैं।जस्ट-इन-टाइम संकलन - यह वास्तव में जावा में कब होता है?

इसका उत्तर यह था कि जावा कोड को अक्सर मशीन कोड पर संकलित किया जाता है, अगर केवल जेवीएम गणना करता है तो यह मानक तरीके से प्रोग्राम की तुलना में तेज़ी से प्रोग्राम बनाता है।

मेरे प्रश्न हैं: जेवीएम वास्तव में समय-समय पर संकलन करने के लिए "निर्णय" कब करता है? मानक बाइटकोड व्याख्यान से जेआईटी को अधिक कुशल बनाने वाले मानदंड क्या हैं? मेरा मतलब है, संकलन कुछ समय लेता है, और जहां तक ​​मैं समझता हूं, यह तब होता है जब कार्यक्रम पहले से चल रहा है?

+0

संदर्भ: [जेआईटी संकलन] (http://en.wikipedia.org/wiki/Just-in-time_compilation) – Coffee

उत्तर

10

यह आपके जेवीएम और इसकी सेटिंग्स के आधार पर व्यापक रूप से भिन्न होता है। विकिपीडिया:

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

-server मोड में एक वेनिला हॉटस्पॉट JVM के लिए एक मोटा अनुमान है कि JIT तब होता है जब JVM देखती है कि एक निश्चित विधि एक बहुत बुलाया गया है, आम तौर पर कई बार कुछ विशिष्ट संख्या से अधिक है। (यही कारण है कि JVM "हॉटस्पॉट" कहा जाता है - क्योंकि यह दिखाता है और "हॉट स्पॉट" अपने कोड में अनुकूलित करता है।) इस बिंदु पर, JVM कुछ चीजें जानता है:

  • यह जानता है इस विधि यह है कि अनुकूलित करने के लिए समय बिताने के लायक है, क्योंकि, ठीक है, इसे बहुत कुछ कहा जाता है।
  • यह इस समारोह के वास्तविक दुनिया विशेषताओं के बारे में बहुत कुछ जानता है:
    • अगर एक if बयान की एक शाखा ज्यादा अन्य की तुलना में अधिक पाया जाता है, तो यह branch prediction
    • अगर सुधार कर सकते हैं जैसे कि एक List इस विधि को पारित किया गया है आमतौर पर ArrayList है, इसलिए यह ArrayList के विशिष्ट मामले के लिए अनुकूलन और इनलाइनिंग कर सकता है।

ध्यान दें कि अगर आप मशीन कोड के लिए अग्रिम में संकलित, तो आप इस जानकारी का एक बहुत अनुकूलन करने के लिए नहीं होगा के साथ - संकलक पहले से पता नहीं है कि कौन से पथ अधिक आम हो जाते हैं दूसरों की तुलना में। लेकिन यदि आप वास्तविक अनुकूलन डेटा तक अपना अनुकूलन करने का इंतजार करते हैं, तो आप बेहतर अनुकूलन निर्णय ले सकते हैं।

जेआईटी क्या करता है इसके बारे में कुछ और विवरण here हैं।

+0

+1 "एक निश्चित विधि को बहुत कुछ कहा गया है" ... "यह जानता है कि यह विधि बहुत कहलाती है ":) लेकिन गंभीरता से, अच्छा जवाब। –

+0

मुझे यकीन नहीं है कि मैं इसे अच्छी तरह से समझता हूं, लेकिन JVM केवल एक विधि को जानता है जिसे अक्सर कई बार बुलाया जाता है। मेरा मतलब है कि जेवीएम बाइटकोड "ऑन-लाइन" का अर्थ देता है, यह "पता नहीं" कितनी बार एक विधि को बुलाया जाएगा, है ना? या संकलक समय पर बाइटकोड में ऐसी जानकारी जोड़ता है? यदि नहीं, तो हमेशा एक मौका होगा कि इस विधि को केवल कार्यक्रम की शुरुआत में बहुत कुछ कहा जाता था, और बाद में यह अप्रयुक्त होता है - ऐसे मामले में, यदि JVM ने इस विधि के साथ जेआईटी का प्रदर्शन किया है, तो यह केवल समय बर्बाद कर देगा (या बहुत समय की, अगर विधि स्वयं बड़ी थी)। – 3yakuya

+0

नहीं, बेशक यह पहले से ही नहीं जानता है; यह अनुमान लगाता है कि अगर किसी विधि को बहुत पहले कहा जाता है, तो इसे बहुत कुछ कहा जाएगा। लेकिन यह अभ्यास में एक पूरी तरह से मान्य धारणा है। –

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