2010-03-24 11 views
12

के बीच JIT में मतभेद हैं मैं Microsoft .NET एक JIT कम्पाइलर के रूप में CLR का उपयोग करता है, जबकि जावा हॉटस्पॉट है पता है। उनके बीच मतभेद क्या हैं?क्या जावा और नेट

+2

के मामले में अंतर ...? – medopal

+1

NGen मूल कोड को MSIL precompile करने के लिए लेकिन जब एक NGen कोड ऐसा नहीं करता एक पूरे विधानसभा के लिए ऐसा नहीं करता है, प्रयोग किया जाता है, नेट CLR में JIT कम्पाइलर आप के लिए उड़ान भरने पर ऐसा ही करेगा। दोनों के बीच की तुलना सीएलआर में जेआईटी कंपाइलर के साथ बेहतर होगी और एनजेन बनाम हॉटस्पॉट के साथ नहीं। – saret

उत्तर

22

वे बहुत अलग जानवरों रहे हैं। जैसा कि लोगों ने बताया, सीएलआर एमएसआईएल के टुकड़े को निष्पादित करने से पहले मशीन कोड में संकलित करता है। यह इसे सामान्य मृत-कोड उन्मूलन के अलावा और लक्ष्य मशीन के विशेष CPU आर्किटेक्चर का लाभ उठाने के लिए निजी अनुकूलन को रेखांकित करने की अनुमति देता है (हालांकि मुझे यकीन नहीं है कि यह ऐसा करता है)। यह प्रत्येक वर्ग के लिए एक हिट भी लगाता है (हालांकि संकलक काफी तेज है और कई प्लेटफार्म पुस्तकालय Win32 एपीआई पर सिर्फ एक पतली परत हैं)।

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

के बाद से हॉटस्पॉट तरीकों स्वैप कर सकते हैं, जबकि वे चल रहे हैं, वीएम compilers कुछ सट्टा अनुकूलन नहीं है जो स्थिर संकलित कोड में असुरक्षित हैं प्रदर्शन कर सकते हैं। एक कैनोलिक उदाहरण मोनोमोर्फिक कॉल की स्थिर प्रेषण/इनलाइनिंग (केवल एक कार्यान्वयन के साथ पॉलिमॉर्फिक विधि) है। यह तब किया जाता है जब वीएम देखता है कि यह विधि हमेशा एक ही लक्ष्य के लिए हल हो जाती है। जटिल आमंत्रण का उपयोग कुछ सीपीयू निर्देश गार्ड में कम हो जाता है, जिसे आधुनिक CPUs द्वारा भविष्यवाणी और पाइपलाइन किया जाता है। जब गार्ड की स्थिति सच हो जाती है, तो वीएम एक अलग कोड पथ ले सकता है या यहां तक ​​कि व्याख्या मोड में भी छोड़ सकता है। आंकड़े और प्रोग्राम वर्कलोड के आधार पर, जेनरेट किया गया मशीन कोड अलग-अलग समय पर अलग हो सकता है। इनमें से कई अनुकूलन कार्यक्रम निष्पादन के दौरान एकत्र की गई जानकारी पर भरोसा करते हैं और यदि आप कक्षा को लोड करते समय संकलित करते हैं तो संभव नहीं है।

यही कारण है कि आपको जेवीएम को गर्म करने और यथार्थवादी वर्कलोड अनुकरण करने की आवश्यकता है जब आप बेंचमार्क एल्गोरिदम (skewed डेटा अनुकूलन के अवास्तविक आकलन का कारण बन सकता है)। अन्य अनुकूलन ताला इलिजन, अनुकूली स्पिन लॉकिंग, से बचने के विश्लेषण और ढेर आवंटन, आदि

कहा कि, हॉटस्पॉट केवल VMs में से एक है कर रहे हैं। जेआरॉकिट, अज़ुल, आईबीएम के जे 9 और रीसेट करने योग्य आरवीएम, - सभी के पास अलग-अलग प्रदर्शन प्रोफाइल हैं।

+0

भी http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html – ddimitrov

+0

देखें यह सच है कि जावा के लिए "सभी बाईटकोड व्याख्या मोड में शुरू होता है" है? मुझे लगता है कि स्टार्ट अप पर भी एक कॉल गिनती है और यदि यह थ्रेसहोल्ड से अधिक है तो उन्हें स्टार्ट अप पर संकलित किया जाएगा। इस संकलक निर्भर हो सकता है: https://www.ibm.com/support/knowledgecenter/en/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/understanding/jit_overview.html – swdon

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