ध्यान रखें कि निम्नलिखित केवल देशी और जेआईटी संकलन के बीच अंतर की तुलना कर रहा है, और किसी विशेष भाषा या रूपरेखा की बारीकियों को कवर नहीं करता है। इससे परे एक विशेष मंच को चुनने के लिए वैध कारण हो सकते हैं।
जब हम दावा करते हैं कि मूल कोड जल्दी है, तो हम विशिष्ट उपयोग के मामले के बारे में बात कर रहे हैं मूल रूप से संकलित कोड बनाम JIT संकलित कोड के , जहां उपयोगकर्ता द्वारा JIT संकलित आवेदन का विशिष्ट उपयोग तत्काल परिणामों के साथ चलाया जाना है (जैसे, नहीं पहले कंपाइलर पर प्रतीक्षा की जा रही है)। उस स्थिति में, मुझे नहीं लगता कि कोई भी सीधे चेहरे के साथ दावा कर सकता है, कि जेआईटी संकलित कोड देशी कोड को मैच या हरा सकता है।
मान लेते हैं कि हमारे पास कुछ भाषा X में लिखा गया प्रोग्राम है, और हम इसे एक देशी कंपाइलर के साथ, और फिर से JIT कंपाइलर के साथ संकलित कर सकते हैं। प्रत्येक कार्य प्रवाह में एक ही चरण शामिल होता है, जिसे (कोड -> मध्यवर्ती प्रतिनिधित्व -> मशीन कोड -> निष्पादन) के रूप में सामान्यीकृत किया जा सकता है। दो में बड़ा अंतर यह है कि कौन से चरण उपयोगकर्ता द्वारा देखे जाते हैं और जो प्रोग्रामर द्वारा देखे जाते हैं। मूल संकलन के साथ, प्रोग्रामर सभी लेकिन निष्पादन चरण देखता है, लेकिन जेआईटी समाधान के साथ, मशीन कोड के संकलन को निष्पादन के अतिरिक्त, उपयोगकर्ता द्वारा देखा जाता है।
दावा है कि A, B से तेज है , कार्यक्रम को चलाने में लगने वाले समय का उल्लेख करता है, जैसा कि उपयोगकर्ता द्वारा देखा गया है । यदि हम मानते हैं कि कोड के दोनों टुकड़े निष्पादन चरण में पहचान करते हैं, तो हमें यह मान लेना चाहिए कि JIT कार्य प्रवाह उपयोगकर्ता के लिए धीमा है, क्योंकि उसे मशीन कोड के संकलन का समय T भी देखना होगा, जहां T> 0. तो , जेआईटी कार्य प्रवाह की किसी भी संभावना के लिए, मूल कार्य प्रवाह को उपयोगकर्ता के समान करने के लिए, हमें कोड के निष्पादन के समय को कम करना होगा, जैसे कि निष्पादन + मशीन कोड का संकलन, केवल निष्पादन चरण से कम है मूल कार्य प्रवाह के। इसका मतलब है कि हमें जेआईटी संकलन में देशी संकलन की तुलना में बेहतर कोड का अनुकूलन करना चाहिए।
हालांकि, यह संभव नहीं है, क्योंकि निष्पादन में तेजी लाने के लिए आवश्यक अनुकूलन करने के लिए, हमें मशीन कोड चरण के संकलन में अधिक समय बिताना होगा, और इस प्रकार, किसी भी समय हम अनुकूलित कोड के परिणामस्वरूप बचत करते हैं, वास्तव में खो जाता है, जैसा कि हम इसे संकलन में जोड़ते हैं। दूसरे शब्दों में, JIT आधारित समाधान का "सुस्ती" केवल JIT संकलन के लिए जोड़े गए समय के कारण नहीं है, बल्कि उस संकलन द्वारा निर्मित कोड एक देशी समाधान की तुलना में धीमी गति से कार्य करता है।
मैं एक उदाहरण का उपयोग करूंगा: आवंटन आवंटित करें। चूँकि मेमोरी एक्सेस रजिस्टर एक्सेस की तुलना में कुछ हज़ार गुना धीमी है, हम आदर्श रूप से जहाँ भी संभव हो रजिस्टरों का उपयोग करना चाहते हैं और हमारे पास जितनी भी मेमोरी एक्सेस हो सकती है, लेकिन हमारे पास सीमित संख्या में रजिस्टर हैं, और हमें आवश्यकता पड़ने पर मेमोरी में स्टेट को भेजना होगा। एक रजिस्टर। यदि हम एक रजिस्टर आवंटन एल्गोरिथ्म का उपयोग करते हैं जो गणना करने के लिए 200ms लेता है, और परिणामस्वरूप हम निष्पादन के समय के 2ms को बचाते हैं - हम JIT कंपाइलर के लिए समय का सबसे अच्छा उपयोग नहीं कर रहे हैं। चैटिन के एल्गोरिथ्म जैसे समाधान, जो अत्यधिक अनुकूलित कोड का उत्पादन कर सकते हैं अनुपयुक्त हैं।
JIT कंपाइलर की भूमिका, उत्पादन कोड के संकलन समय और गुणवत्ता के बीच के सर्वश्रेष्ठ संतुलन पर प्रहार करना है, हालाँकि, तेज़ संकलन समय पर एक बड़े पूर्वाग्रह के साथ, क्योंकि आप उपयोगकर्ता प्रतीक्षा को छोड़ना नहीं चाहते हैं। जेईटी मामले में निष्पादित किए जा रहे कोड का प्रदर्शन धीमा है, क्योंकि देशी कंपाइलर कोड के अनुकूलन में समय से बाध्य (बहुत) नहीं है, इसलिए सर्वश्रेष्ठ एल्गोरिदम का उपयोग करने के लिए स्वतंत्र है। संभावना है कि एक JIT संकलक के लिए समग्र संकलन + निष्पादन मूल रूप से संकलित कोड के लिए केवल निष्पादन समय को हरा सकता है प्रभावी रूप से 0।
लेकिन हमारे वीएम केवल जेआईटी संकलन तक सीमित नहीं हैं। वे अहेड-ऑफ-टाइम संकलन तकनीक, कैशिंग, हॉट स्वैपिंग और अनुकूली अनुकूलन का उपयोग करते हैं। तो चलिए हमारे दावे को संशोधित करते हैं कि प्रदर्शन वही है जो उपयोगकर्ता देखता है, और इसे कार्यक्रम के निष्पादन के लिए लिए गए समय तक सीमित करें (मान लें कि हमने एओटी संकलित किया है)। हम प्रभावी रूप से निष्पादन कोड को मूल संकलक (या शायद बेहतर?) के बराबर बना सकते हैं। VMs के लिए एक बड़ा दावा यह है कि वे बेहतर गुणवत्ता कोड तब एक देशी संकलक का उत्पादन करने में सक्षम हो सकते हैं, क्योंकि इसमें अधिक जानकारी तक पहुंच है - जो चल रही प्रक्रिया की, जैसे कि एक निश्चित फ़ंक्शन को कितनी बार निष्पादित किया जा सकता है। VM गर्म स्वैपिंग के माध्यम से सबसे आवश्यक कोड के लिए अनुकूली अनुकूलन लागू कर सकता है।
हालांकि इस तर्क के साथ एक समस्या है - यह मानता है कि प्रोफ़ाइल-निर्देशित अनुकूलन और वीएम के लिए कुछ अद्वितीय है, जो सच नहीं है। हम इसे मूल संकलन पर भी लागू कर सकते हैं - प्रोफाइलिंग सक्षम के साथ हमारे आवेदन को संकलित करके, सूचना दर्ज करना, और फिर उस प्रोफ़ाइल के साथ आवेदन को फिर से जमा करना। यह शायद यह भी इंगित करने योग्य है कि कोड हॉट स्वैपिंग कुछ ऐसा नहीं है जो केवल एक जेआईटी कंपाइलर ही कर सकता है, हम इसे देशी कोड के लिए भी कर सकते हैं - हालांकि ऐसा करने के लिए जेआईटी आधारित समाधान अधिक आसानी से उपलब्ध हैं, और डेवलपर पर बहुत आसान है। तो बड़ा सवाल यह है कि क्या कोई वीएम हमें कुछ ऐसी जानकारी दे सकता है जो देशी संकलन नहीं कर सकता, जो हमारे कोड के प्रदर्शन को बढ़ावा दे सकता है?
मैं इसे खुद नहीं देख सकता। हम एक विशिष्ट वीएम की अधिकांश तकनीकों को मूल कोड में भी लागू कर सकते हैं - हालांकि प्रक्रिया अधिक शामिल है। इसी तरह, हम एक मूल संकलक के किसी भी अनुकूलन को एक वीएम पर वापस लागू कर सकते हैं जो एओटी संकलन या अनुकूली अनुकूलन का उपयोग करता है। वास्तविकता यह है कि मूल रूप से रन कोड के बीच अंतर है, और एक वीएम में रन उतना बड़ा नहीं है जितना कि हमें विश्वास करने के लिए बनाया गया है। वे अंततः उसी परिणाम का नेतृत्व करते हैं, लेकिन वे वहां पहुंचने के लिए एक अलग दृष्टिकोण लेते हैं। VM अनुकूलित कोड का उत्पादन करने के लिए एक पुनरावृत्त दृष्टिकोण का उपयोग करता है, जहां मूल संकलक इसे शुरू से उम्मीद करता है (और पुनरावृत्त दृष्टिकोण के साथ इसमें सुधार किया जा सकता है)।
एक C ++ प्रोग्रामर यह तर्क दे सकता है कि उसे गेट-गो से ऑप्टिमाइज़ेशन की आवश्यकता है, और वीएम का इंतजार नहीं करना चाहिए ताकि उन्हें पता चले कि उन्हें कैसे करना है। यह शायद हमारी वर्तमान तकनीक के साथ एक वैध बिंदु है, हालांकि, हमारे वीएम में वर्तमान स्तर का अनुकूलन मूल संकलक क्या पेशकश कर सकता है - से हीन है, लेकिन ऐसा हमेशा नहीं हो सकता है यदि हमारे वीएम में एओटी समाधान में सुधार हो, आदि।