2012-02-29 10 views
5

सी # और जावा जैसी जेआईटीड भाषाओं के पक्ष में एक तर्क यह है कि वे अनुकूलन निष्पादन कर सकते हैं क्योंकि वर्चुअल मशीन द्वारा रनटाइम प्रोफाइलिंग सी ++ के स्थिर रूप से अनुकूलित कोड से बेहतर कोड अनुकूलित कर सकती है।प्रदर्शन को अनुकूलित करने के लिए सी ++ के लिए एक वर्चुअल मशीन

हालांकि, मैं सोच रहा था कि क्या हम सी ++ के लिए रनटाइम पर कोड अनुकूलित करने के लिए वर्चुअल मशीन का उपयोग कर सकते हैं, या किसी भी समान भाषा के लिए। उदाहरण के लिए, हम एलएलवीएम कंपाइलर द्वारा उत्पन्न आईआर ले सकते हैं और एक वर्चुअल मशीन बना सकते हैं जो जावा और सी # के मामले में कोड, जेआईटी और कोड को ऑप्टिमाइज़ करता है।

संभोग, कोई कचरा संग्रह नहीं होगा, लेकिन अनुकूलन कारक वहां होगा। क्या किसी ने इस पर काम किया है। क्या इस पर कोई कागजात, उपकरण हैं? यह दृष्टिकोण कितना अच्छा होगा?

+3

["क्लैंग" + "जेआईटी" के लिए एक Google खोज] (https://www.google.com/search?q=clang+jit) बहुत सारी जानकारी खींचती है। – ruakh

+1

Google क्रोम को अपडेट करते समय कुछ दिलचस्प करता है ... प्रोग्राम आंशिक रूप से अपरिवर्तित हो जाता है, ताकि कुछ हद तक प्रतीकात्मक रूप प्राप्त हो सके, फिर अद्यतन को उस रूप में पैच के रूप में लागू किया जाता है, और फिर यह संकलित हो जाता है। इसके अलावा, दिनों में लोग पॉलिमॉर्फिक प्रोग्राम लिखेंगे जो रनटाइम पर खुद को फिर से लिखेंगे (कहें, जब उन्हें पता चलता है कि 'if' स्थिति कभी भी झूठी नहीं होगी, तो वे सिर्फ' nop' के साथ निर्देश को प्रतिस्थापित करेंगे)। इसलिए, ऐसा कोई कारण नहीं है कि यह व्यवहार्य क्यों नहीं होना चाहिए। मैं "संभव" का भी उल्लेख नहीं कर रहा हूं, क्योंकि हम जानते हैं कि यह मामला है। –

+0

वे वास्तव में बेहतर अनुकूलित कर सकते हैं, लेकिन वे नहीं करते हैं। –

उत्तर

2

सैद्धांतिक रूप से बोलते हुए, हाँ, सी ++ के लिए एक जेआईटी बनाया जा सकता है। कोड को आक्रामक रूप से अनुकूलित करने के लिए अंतर्निहित वास्तुकला में कुछ चीजों का लाभ उठा सकता है। यह रनटाइम पर लोड होने में अधिक समय लेने के नकारात्मक पक्ष के साथ भी आ जाएगा।

बेशक, वहाँ कोई कचरा संग्रहण और यह की वजह से इसलिए भूमि के ऊपर होगा, लेकिन अनुकूलन कारक होगी। किसी ने इस पर काम किया है। क्या इस पर कोई कागजात, उपकरण हैं? कितना अच्छा होगा?

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

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

प्रत्येक यूडीटी इंस्टेंस को एक संदर्भ में बदलना मतलब है कि सबकुछ ढेर पर है, जो प्रभावी रूप से संचालन को प्रभावी रूप से बदल रहा है जो मूल रूप से कुछ घड़ी चक्र सैकड़ों में हैं।

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

+1

कहकर "कोई कचरा संग्रह नहीं होगा और इसलिए इसके कारण ओवरहेड होगा", मैं कह रहा हूं कि चूंकि कोई कचरा संग्रह नहीं होगा, तो ओवरहेड कम होगा। आप इसे दूसरी तरफ पढ़ते हैं :)! – MetallicPriest

+0

@ मेटालिक प्रिस्ट ओह मेरे बुरे, मैंने सोचा कि वाक्य का मतलब है कि जीसी की कमी के कारण ओवरहेड शामिल होगा। मैं सी #/जावा उत्साही लोगों का अक्सर दावा करता हूं कि जीसी किसी भी तरह चीजों को तेज़ी से बनाता है। यह सच है कि जब हम नहीं देख रहे हैं तो यह स्मृति को कॉम्पैक्ट कर सकता है लेकिन किसी को यह सवाल करना पड़ता है कि इसे पहले स्थान पर क्यों करना है, जब सी ++ में, हम केवल उपयोगकर्ता द्वारा परिभाषित प्रकारों के संगत, कॉम्पैक्ट सरणी बना सकते हैं (जैसे मैट्रिक्स) शुरुआत से ही। – stinky472

4

एलएलवीएम में एक जेआईटी कंपाइलर, एलआईआई, और क्लैंग शामिल है जो पहले ही सी ++ से बिटकोड उत्पन्न कर सकता है। मैंने कोशिश नहीं की है, लेकिन मुझे लगता है कि आप उत्पादित बिटकोड फ़ाइलों पर लिली का उपयोग कर सकते हैं (आपको यह कहना होगा कि सी ++ lib फ़ाइलों को लिंक करने के लिए कहां मिलना है) और जेआईटी सी ++ रनटाइम पर। आपको libC++ को बिटकोड के रूप में भी बनाने में सक्षम होना चाहिए ताकि यह भी JITed हो सके।

Google के मूल ग्राहक के पास एक उप प्रोजेक्ट, पोर्टेबल नेटिव क्लाइंट है, जहां मुझे लगता है कि क्लाइंट पर लगाए जाने के लिए x86 बाइनरी के बजाय एलएलवीएम आईआर क्लाइंट को भेजा जाता है।

7

यह एक दोषपूर्ण तर्क है। हां, आभासी मशीनों के साथ काम करने के लिए अधिक जानकारी है- लेकिन उनके पास कंपाइलर्स की तुलना में काफी कम समय और स्थान भी है।

इसके अलावा, हाँ, बिल्कुल आप इसे कर सकते हैं यदि आप वास्तव में करना चाहते हैं। लेकिन कोई भी नहीं करता है, इसलिए यह आमतौर पर नहीं हो रहा है।कम से कम, ऑप्टिमाइज़ेशन कारणों के लिए नहीं, आप इसे सैंडबॉक्सिंग के लिए कर सकते हैं।

+1

आप क्लैंग की तरह बाइटकोड पर सी ++ को प्रीकंपाइल कर सकते हैं, जिस बिंदु पर आप पहले से ही कई अनुकूलन कर सकते हैं। – Xeo

+1

@Xeo: सैद्धांतिक रूप से हां। लेकिन सी/सी ++ अनुकूलक बहुत पुराना है (कंप्यूटर शर्तों में) और अपेक्षाकृत अच्छी नौकरी करता है। तो हो सकता है कि कोई अतिरिक्त प्रदर्शन लाभ नगण्य हो। किसी को इस पर एक पेपर प्रकाशित करना अच्छा लगेगा (शायद उन्होंने कोशिश की है कि यह इसे निष्फल पाया गया हो)। –