2009-11-12 13 views
10

मैं जावा सी ++ की तुलना में तेजी हो सकता है, इस पर कुछ सामग्री तक पढ़ रहा हूँ, और निम्नलिखित उद्धरण में आए:वर्चुअल फ़ंक्शन सीमाओं पर जावा इनलाइन कैसे हो सकता है?

"जावा तेजी सी से हो सकता है ++ क्योंकि JITs आभासी समारोह सीमाओं पर इनलाइन सकते हैं।"

(http://www.jelovic.com/articles/why_java_is_slow.htm)

इसका क्या मतलब है? क्या इसका मतलब यह है कि जेआईटी आभासी फ़ंक्शन कॉल को रेखांकित कर सकता है (क्योंकि संभवतः इसे रन टाइम जानकारी तक पहुंच है) जबकि सी ++ को अपने vtable के माध्यम से फ़ंक्शन को कॉल करना होगा?

धन्यवाद

टारस

उत्तर

9

आपके प्रश्न का उत्तर हाँ है: उद्धृत पाठ का यही अर्थ है।

जेआईटी सभी भारित वर्गों का विश्लेषण करेगा। यदि यह निर्धारित कर सकता है कि किसी भी बिंदु पर केवल एक संभावित विधि कहा जा सकता है, तो यह प्रेषण से बच सकता है और (यदि उपयुक्त हो) विधि निकाय को रेखांकित कर सकता है।

इसके विपरीत, एक सी ++ संकलक संभव उपप्रकार के सभी को पता है कि नहीं, और इसलिए निर्धारित नहीं कर सकता इस अनुकूलन एक (आभासी) विधि के लिए किया जा सकता है। (और जब तक लिंकर चलता है, यह बहुत देर हो चुकी है ...)

अन्य उत्तरों ने कहा है कि आप सी ++ में हाथ से यह अनुकूलन कर सकते हैं ... लेकिन यह मानता है कि आप (प्रोग्रामर) कर सकते हैं खुद का विश्लेषण करें, और वर्चुअल से गैर-आभासी तरीकों को बदलें। लेकिन अगर आपको यह गलत लगता है, तो आपको ट्रैक करने के लिए एक बग मिला है।

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

+0

+1 – ykaganovich

+0

एक लाभ यह है कि गेटर्स और सेटर्स को पूर्ण रूप से जुर्माना भुगतान किए बिना पूर्ण अमूर्त सुरक्षा (इंटरफेस और सभी को कोडिंग) का अर्थ दिया जा सकता है। –

2

क्या इसके लायक, जावा, सी ++, विधानसभा अपेक्षाकृत एक ही प्रदर्शन प्रदान करेगा।

हां, बेहतर प्रदर्शन को हैंडोपिटिज्ड सी ++, सी, या एएसएम के साथ बेहतर प्रदर्शन किया जा सकता है ... हालांकि, वहां अनुप्रयोगों की महिमा के लिए (गंभीर ग्राफिक्स ऐप्स के बाहर सबकुछ आज़माएं), यह बाधा नहीं है, और- कार्यान्वयन की कम लागत किसी भी कम प्रदर्शन के लिए बनाता है।

4

चूंकि मशीन कोड में जावा बाइटकोड का संकलन रनटाइम तक स्थगित कर दिया गया है, इसलिए JVMs को profile-guided optimization और अन्य ऑप्टिमाइज़ेशन करने के लिए संभव है, जिनके लिए कोड चलने तक जानकारी उपलब्ध नहीं है। इसमें "deoptimization" भी शामिल हो सकता है, जहां पहले बनाया गया अनुकूलन निरस्त कर दिया गया है ताकि अन्य अनुकूलन हो सकें।

इस बारे में अधिक जानकारी विकिपीडिया, जो इनलाइनिंग से संबंधित अनुकूलन शामिल हैं पर adaptive optimization के नीचे पाया जा सकता है।

+0

मुझे लगता है कि सी ++ कंपाइलर्स मौजूद हैं जो यह निर्धारित करने के लिए प्रोफाइल जानकारी का उपयोग कर सकते हैं कि इन अनुकूलन को करना है या नहीं। सी ++ के साथ वास्तविक समस्या यह है कि मानक लिंक मॉडल का मतलब है कि कॉलर और कैली को एक साथ संकलित नहीं किया जाता है। –

+0

हाँ, नया जीसीसी इस तरह के लिंक-टाइम अनुकूलन (एलटीओ) कर सकता है। वास्तविक प्रश्न का उत्तर देने के लिए –

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