2015-11-11 13 views
5

कोई समस्या नहीं है NET और RyuJIT .NET 4.6 (विशेष रूप से विभिन्न अनुकूलन तकनीकों और एल्गोरिदम के साथ) के तहत दो पूरी तरह से असंबंधित चीजें हैं?Ngen बनाम RyuJIT - सबसे तेज़ x64 चलने वाला कोड जब (प्री-) स्टार्टअप

यदि हम खुद को और/या ठंड/गर्म स्टार्टअप समय को जुटाने की लागत पर ध्यान नहीं देते हैं तो सबसे तेज़ (बेहतर अनुकूलित) x64 देशी कोड क्या बनाता है?

हम एक लंबे समय तक चल रहे सर्वर ऐप चला रहे हैं। निरंतर चलने वाला चरण बहुत महत्वपूर्ण प्रदर्शन-वार है। (प्री-) स्टार्टअप चरण हमारे लिए महत्वहीन नहीं है। अब तक हम .NET 4.5 पर रहे हैं और हमेशा नेजेन द्वारा देशी छवियां उत्पन्न की हैं। अब हम .NET 4.6 में अपग्रेड करने की प्रक्रिया में हैं और हम यह सुनिश्चित करना चाहते हैं कि यह हमारे निरंतर चल रहे चरण के प्रदर्शन को डाउनग्रेड नहीं करेगा। मैंने कुछ जानकारी पढ़ी है कि जेयूआईटीआईटी समय में सुधार के लिए RyuJIT बहुत अच्छा विकल्प है, लेकिन जेनेट कोड को एनजेन की तुलना में कम अनुकूलित किया जा सकता है - उदा। this github comment on one of the RyuJIT bugs

उत्तर

10

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

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

जब आप .NET मूल का लाभ उठा सकते हैं तो आप आगे बढ़ेंगे। यह सी ++ कंपाइलर के बैक-एंड के साथ अगली बार कोड उत्पन्न करता है। लेकिन वर्तमान में, और निश्चित रूप से आने वाले कुछ समय के लिए, यह केवल पैकेज किए गए ऐप्स के लिए समर्थित है। विंडोज स्टोर के माध्यम से वितरित की जाने वाली तरह, आपको स्टोर, फोन या यूनिवर्सल को लक्षित करना होगा और स्टोर को तैनाती वाहन के रूप में उपयोग करना होगा। पैकेज .NET मूल कार्य करने के लिए बहुत महत्वपूर्ण है, केवल सभ्य तरीका है कि यह देख सकता है कि किस कोड को अनुवादित करने की आवश्यकता है। और इसे अक्सर इसे सही करने में मदद की ज़रूरत होती है, प्रतिबिंब हल करने में एक मुश्किल समस्या है, जिस कारण से आप इसे अपनी मशीन पर रखते हैं। ध्यान दें कि एनजीएन के लिए एक ही समस्या मौजूद नहीं है, यह अभी भी कुछ कोड प्राप्त करने के लिए जिटर पर निर्भर करता है। प्रतिबिंब लक्ष्य कोड और जेनेरिक की तरह। यह कुछ दिन बदल सकता है असंभव नहीं है।

जैसा कि ध्यान दिया गया है, एनजीएन कोड थोड़ा धीमा है। इसलिए यदि आपको गर्म शुरुआत में देरी की परवाह नहीं है तो आप एनजेन का उपयोग नहीं करना चाहते हैं।

अंतिम लेकिन कम से कम नहीं, RyuJIT अपने पूर्ववर्ती की तुलना में तेज़ कोड उत्पन्न करता है। जो पहले से ही अनुकूलन का एक बहुत ही सभ्य काम किया है। बहुत सभ्य RyuJIT परियोजना विरासत x64 जिटर में ऐसी समस्याओं को ठीक करने के लिए शुरू की गई थी, जो कोड आधार में बहुत मौलिक थे और केवल एक कठोर पुनर्लेखन के साथ हल किया जा सकता था। ऑप्टिमाइज़ेशन उनमें से एक था, इस पर खर्च किए गए समय पर इसका कोई ऊपरी बाध्य नहीं था। बड़ी विधियों पर इसे बहुत ही अनुचित जिंगिंग समय देना। तो यदि आप आखिरी औंस को निचोड़ना चाहते हैं तो जानबूझकर RyuJIT को अक्षम करना ताकि यह विरासत x64 जिटर पर वापस आ जाए जो आपको कोशिश करनी चाहिए।

+0

हंस, आप .NET JIT की कोड गुणवत्ता की प्रशंसा करते हुए मेरे दिल को तोड़ देते हैं। – usr

+0

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

+0

@usr - आप मेरी पोस्ट पढ़ रहे हैं भूरे रंग के चश्मा। प्रशंसा?? मैंने .NET मूल को छोड़ दिया नहीं। –

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