2010-03-08 14 views
44

के लिए वास्तव में अनुकूलित करता है जब मैं सी # या जावा जैसी जिटेटेड भाषाओं के प्रदर्शन के बारे में पढ़ता हूं, लेखक आमतौर पर कहते हैं कि उन्हें सैद्धांतिक रूप से कई देशी संकलित अनुप्रयोगों को बेहतर प्रदर्शन करना चाहिए। सिद्धांत यह है कि मूल अनुप्रयोगों को आमतौर पर प्रोसेसर परिवार (जैसे x86) के लिए संकलित किया जाता है, इसलिए संकलक कुछ अनुकूलन नहीं कर सकता क्योंकि वे वास्तव में सभी प्रोसेसर पर अनुकूलन नहीं कर सकते हैं। दूसरी तरफ, सीएलआर जेआईटी प्रक्रिया के दौरान प्रोसेसर-विशिष्ट अनुकूलन कर सकता है।क्या .NET CLR वर्तमान प्रोसेसर

क्या किसी को पता है कि माइक्रोसॉफ्ट (या मोनो) सीएलआर वास्तव में जेआईटी प्रक्रिया के दौरान प्रोसेसर-विशिष्ट अनुकूलन करता है? यदि हां, तो किस तरह के अनुकूलन?

+0

जहां तक ​​मुझे पता है, अभी, वास्तव में नहीं। – zneak

+1

एक षड्यंत्र सिद्धांतवादी यह भी सोच सकता है कि क्या एमआईटी एक प्रतिस्पर्धी प्रणाली के तहत चल रहा है, जैसे कि x86 मैक पर वर्चुअलाइज्ड होने पर एमआईटी को डी-ऑप्टिमाइज़ करने के लिए कोड कर सकता है, मानते हैं कि वे यह पता लगा सकते हैं कि यह मैक था। – AaronLS

+8

@ हारून: मैकबीयू माइक्रोसॉफ्ट के लिए राजस्व में अनुमानित 350 मिलियन डॉलर सालाना बनाता है। मैक माइक्रोसॉफ्ट के लिए एक * लाभ केंद्र * है, जो ऐप्पल के बाहर दुनिया में मैक सॉफ्टवेयर का सबसे बड़ा प्रदाता है। ये तथ्य आपके साजिश सिद्धांत में कैसे फिट होते हैं? –

उत्तर

27

2005 में वापस, डेविड नोटारियो ने कई विशिष्ट लक्षित अनुकूलन सूचीबद्ध किए हैं, उनकी ब्लॉग प्रविष्टि "Does the JIT take advantage of my CPU?" है। मुझे नए सीएलआर 4 के बारे में कुछ भी नहीं मिला, लेकिन मुझे लगता है कि कई नए आइटम शामिल हैं।

+4

वाह। यह एक अच्छा खोज है। +1 –

+0

अच्छा लिंक, धन्यवाद। +1 – dewald

+0

ब्लॉग से उद्धरण: "हम कोड वेक्टरेट नहीं करते हैं (जो एसएसई 2 के साथ असली जीत है)"। तो दुख की बात है, जेआईटी ज्यादा फायदे नहीं लेता है। – colinfang

8

एक प्रोसेसर विशिष्ट अनुकूलन मुझे पता है कि मोनो में किया गया है Mono.Simd calls एसएसई का समर्थन करने वाले प्रोसेसर पर एसएसई निर्देशों को संकलित कर रहा है। यदि कोड चलाने वाला प्रोसेसर एसएसई का समर्थन नहीं करता है, तो जेआईटी कंपाइलर बराबर गैर-एसएसई कोड आउटपुट करेगा।

1

मुझे लगता है कि कुछ जावा कंपाइलर्स करते हैं, माइक्रोसॉफ्ट .NET नहीं करता है, और जब आप संतरे से सेब की तुलना करते हैं तो यह केवल प्रीकंपिल्ड हो जाता है। Precompiled विभिन्न पुस्तकालयों (या अधिक संभावना, अलग निर्देश सेट) के लिए एक लाइब्रेरी वेरिएंट के साथ जहाज कर सकते हैं और रनटाइम चेक चुनने के लिए कि कौन सी लाइब्रेरी लोड करने के लिए जेआईटी से बहुत सस्ता है। उदाहरण के लिए, mplayer यह करता है (mplayer सक्षम-रनटाइम-cpudetection के लिए Google)।

+0

क्या आपके पास अपने दावे का समर्थन करने का संदर्भ है कि एमएस .NET नहीं है? यह सवाल नहीं उठा रहा है, बस सोच रहा है कि क्या यह राय या दस्तावेज तथ्य है। –

+2

ठीक है, यह पता चला है कि माइक्रोसॉफ्ट .NET निर्देश सेट के आधार पर कुछ अनुकूलन करता है लेकिन विशेष CPU विशेषताओं जैसे कैश लेआउट (http://blogs.msdn.com/davidnotario/archive/2005/08/15/451845। aspx)।Precompiled कोड के बारे में मेरा बिंदु एक ही अनुकूलन (और जेआईटी कंपाइलर में खोजने के लिए बहुत महंगा है) का उपयोग करने में सक्षम होने के बावजूद अभी भी है। –

0

मैं प्रोसेसर प्रकार (x86, x64) के आधार पर फ़ंक्शन इनलाइन इनलाइन करने के लिए नियमों को जानता हूं या नहीं। और निश्चित रूप से पॉइंटर आकार 32-बिट या 64-बिट के रूप में चलने पर निर्भर करता है।

+0

हाँ, लेकिन पॉइंटर आकार _always_ परिवर्तन, कोई फर्क नहीं पड़ता कि आप पारंपरिक कंपाइलर का उपयोग कर रहे हैं या नहीं। – zneak

2

32 और 64 बिट जिटर अलग हैं, यह एक शुरुआत है।

+0

जैसा कि मैं प्रश्न को समझता हूं, ओपी प्रोसेसर-विशिष्ट अनुकूलन * प्रोसेसर परिवार * के भीतर देख रहा है (उदाहरण के लिए यह वर्तमान प्रोसेसर के आधार पर विशिष्ट कोड उत्पन्न करता है नेटबर्स्ट बनाम कोर माइक्रोआर्किटेक्चर पर आधारित है, दोनों 32 बिट मोड में चल रहे हैं?) –

+0

@ मेहरदाद, मुझे पता है कि यह मुख्य दिशा नहीं थी, लेकिन मैंने सोचा कि यह उल्लेखनीय है। –

2

नेट फ्रेमवर्क रनटाइम ऑप्टिमाइज़ेशन सेवा न केवल प्रोग्रामिंग मुद्दों (कंपाइलर के अनुकूलन) को अनुकूलित करता है बल्कि प्रोसेसर के लिए भी अनुकूलित करता है।

2

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

+0

क्या माइक्रोसॉफ्ट के सीएलआर इनलाइन कैशिंग करते हैं? – dewald

+0

@dewald - मुझे नहीं पता कि, लेकिन मुझे विश्वास है कि कई जावा वीएम करते हैं। चूंकि विधियां सी # (जावा के विपरीत) में डिफ़ॉल्ट रूप से आभासी नहीं हैं, इसलिए मुझे लगता है कि यह .NET के लिए कम प्राथमिकता थी। हालांकि, यह केवल एक उदाहरण है कि रनटाइम पर एक जेआईटी द्वारा ऑप्टिमाइज़ेशन कैसे किए जा सकते हैं जो स्थिर रूप से कठिन या असंभव हैं। – kvb

+2

@dewald - सीएलआर और जेवीएम दृष्टिकोण के बीच के विपरीत पर http://stackoverflow.com/questions/1255803/does-the-net-clr-jit-compile-every-method-every-time देखें। – kvb

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