2009-04-04 15 views
44

क्या किसी ने कभी भी ngen का उपयोग किया है? कहा पे? क्यूं कर? क्या कोई प्रदर्शन सुधार हुआ था? इसका उपयोग कब और कहां समझ में आता है?क्या आपने कभी ngen.exe का उपयोग किया है?

+9

भागो 'NGEN/show' साथ 35.3s जो इसे :) –

उत्तर

18

हाँ, मैंने देखा है प्रदर्शन में सुधार -

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

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

+1

मुझे इस कथन के बारे में निश्चित नहीं था, "यदि आपकी असेंबली मजबूत हैं नामित, जीएएन के प्रयोग किए बिना एनजेन कोई फर्क नहीं पड़ेगा। " हालांकि, [इस पोस्ट] (http://blogs.msdn.com/b/abhinaba/archive/2013/12/11/net-loading-native-ngen-images-and-its-interaction-with-the-gac .aspx) बयान को कुछ हद तक पुष्टि करता है।यह कहना अधिक सटीक होगा, "एनजेएन सबसे प्रभावी है (प्रदर्शन और स्मृति उपयोग के मामले में) जब गैले में असेंबली होती है।" (आपको याद है, यह पोस्ट संदर्भित एमएसडीएन ब्लॉग की भविष्यवाणी करता है।) – Olly

7

ngen ज्यादातर स्टार्टअप समय (जेआईटी संकलन को समाप्त करके) में सुधार के लिए जाना जाता है। इसमें सुधार हो सकता है (जेआईटी समय को कम करके) या आवेदन के समग्र प्रदर्शन को कम करें (चूंकि कुछ जेआईटी अनुकूलन उपलब्ध नहीं होंगे)।

.NET Framework स्वयं स्थापना पर कई असेंबली के लिए ngen का उपयोग करता है।

+1

का उपयोग करता .नेट फ्रेमवर्क स्थापित करने के बाद देखने के लिए और मशीन को पुन: प्रारंभ, ".NET रनटाइम अनुकूलन सेवा" अभी भी कड़ी मेहनत कर रहा है "ngening" अपने DLLs के सभी ... –

+0

हाँ। यह .NET 2.0 स्थापना में नई सुविधाओं में से एक था। मैं स्पष्ट रूप से .NET 1.1 स्थापना में "मूल छवियां उत्पन्न करना" स्थिति याद करता हूं। –

+0

वैसे यह सही समझ में आता है। ढांचे डीएलएल का इस्तेमाल सिस्टम पर हर गैर तुच्छ .NET अनुप्रयोग में किया जाएगा। ढांचे को जेआईटी करना संभव नहीं था .net के लिए लिखे गए प्रत्येक कार्यक्रम के प्रदर्शन में सुधार होगा। आप देख सकते हैं कि विजुअल स्टूडियो इंस्टॉलर सिंक्रनाइज़ रूप से दृश्य स्टूडियो के प्रबंधित अनुभागों का ngen है (जो संयोग से यह SOOOO इंस्टॉल करने में लंबा लगता है)। – Spence

29

मैं इसे दिन-प्रतिदिन उपयोग नहीं करता, लेकिन इसका उपयोग उन उपकरणों द्वारा किया जाता है जो प्रदर्शन को बढ़ावा देना चाहते हैं; उदाहरण के लिए, Paint.NET इंस्टॉलर के दौरान एनजीएनएन का उपयोग करता है (या शायद पहले उपयोग)। यह संभव है (हालांकि मुझे यकीन नहीं है) कि कुछ एमएस उपकरण भी करते हैं।

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

डाउनसाइड, आईएमओ, यह है कि आपको एनजीईएन का उपयोग करने के लिए जीएसी का उपयोग करने की आवश्यकता है; मैं जितना संभव हो सके जीएसी से बचने की कोशिश करता हूं, ताकि मैं रोबोकॉपी-तैनाती (सर्वर पर) और क्लिकऑन (क्लाइंट्स) का उपयोग कर सकूं।

+2

आपको एनजीएनएन का उपयोग करने के लिए जीएसी का उपयोग करने की आवश्यकता नहीं है। http://blogs.msdn.com/b/abhinaba/archive/2013/12/11/net-loading-native-ngen-images-and-its-interaction-with-the-gac.aspx – Shiv

1

मैंने इसका उपयोग किया है लेकिन केवल शोध उद्देश्य के लिए। इसका उपयोग केवल तभी करें जब आप अपने परिनियोजन पर्यावरण के सीपीयू आर्किटेक्चर के बारे में सुनिश्चित हों (यह बदल नहीं जाएगा)

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

जेआईटी ऐसे मामलों में एक स्पष्ट विजेता है, क्योंकि यह सीपीयू आर्किटेक्चर के आधार पर फ्लाई पर कोड अनुकूलित करता है। (उदाहरण के लिए यह पता लगा सकता है कि 1 सीपीयू अधिक है या नहीं)

और प्रत्येक रिलीज के साथ क्लियर बेहतर हो रहा है, इसलिए जेआईटी के साथ छोटी छड़ी में जब तक कि आप अपने परिनियोजन पर्यावरण के बारे में निश्चित नहीं हैं - तब भी आपके प्रदर्शन लाभ शायद ही कभी होंगे (शायद लाभ कुछ सौ एमएस में होगा) ngen.exe का उपयोग कर का औचित्य साबित - imho - JIT Compilation and Performance - To NGen or Not to NGen?

+2

एमएस चलाने के लिए कहते हैं स्थानीय रूप से ngen, तो निषेध को समझ में नहीं आता .... या आप मानते हैं कि आप ngen के परिणाम वितरित करेंगे? – Richard

+1

मुझे समझ में नहीं आता कि आप अपनी विकास मशीन से 'ngen'ed असेंबली कैसे शिप करेंगे। क्या आप इसे विस्तार में बताने में सक्षम हैं? –

+3

विचार यह है कि आप उस मशीन पर NGEN चलाते हैं जहां यह निष्पादित होता है, उदाहरण के लिए स्थापना के दौरान। फिर एकमात्र समस्या यह है कि यदि आप फ्लाई पर सीपीयू बदलते हैं (शायद हार्डवेयर विफलता के बाद पुनर्स्थापित करें, या उदाहरण के लिए पी 2 वी का उपयोग करें)। –

8

Ngen मुख्य रूप से .NET ऐप और एप्लिकेशन के कार्य सेट के स्टार्ट-अप समय को कम कर देता है। लेकिन यह कुछ नुकसान (से जेफरी रिक्टर की CLR के माध्यम से सी #) है:

कोई बौद्धिक संपदा संरक्षण

NGen'd फ़ाइलें सिंक्रनाइज़ेशन से बाहर प्राप्त कर सकते हैं

अवर लोड समय प्रदर्शन (रिबेसिंग/बाइंडिंग)

अवर निष्पादन समय प्रदर्शन

मुद्दों सिर्फ सूचीबद्ध सभी के कारण, आप बहुत सावधान जब NGen.exe के उपयोग पर विचार किया जाना चाहिए। सर्वर-साइड अनुप्रयोगों के लिए, NGen.exe कम या कोई समझ नहीं करता है क्योंकि केवल पहले क्लाइंट अनुरोध प्रदर्शन प्रदर्शन का अनुभव करता है; भावी ग्राहक अनुरोध उच्च गति पर चलते हैं। अधिकांश सर्वर अनुप्रयोगों के लिए अतिरिक्त में, कोड का केवल एक उदाहरण आवश्यक है, इसलिए कार्य सेट लाभ नहीं है।

क्लाइंट अनुप्रयोगों के लिए, NGen.exe स्टार्टअप समय को बेहतर बनाने या को कम करने के लिए समझ सकता है यदि एक असेंबली एक साथ कई अनुप्रयोगों द्वारा उपयोग की जाती है। यहां तक ​​कि में एक मामले में जो एक असेंबली का उपयोग कई अनुप्रयोगों द्वारा नहीं किया जाता है, एनजीएनिंग एक असेंबली कार्य सेट में सुधार कर सकती है। इसके अलावा, यदि किसी क्लाइंट एप्लिकेशन की असेंबली के लिए NGen.exe का उपयोग किया जाता है, तो CLR को जेआईटी कंपाइलर को लोड करने की आवश्यकता नहीं होगी, और भी कामकाजी सेट को और भी कम करना होगा। बेशक, यदि केवल एक असेंबली एनजीएनडी नहीं है या यदि किसी असेंबली की एनजेएनएड फ़ाइल का उपयोग नहीं किया जा सकता है, तो जेआईटी कंपाइलर लोड हो जाएगा, और एप्लिकेशन का कामकाजी सेट बढ़ जाएगा।

+1

'कोई बौद्धिक संपदा सुरक्षा' कैसे आती है? –

+1

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

0

हां। स्टार्टअप समय को गति देने के लिए एक WPF एप्लिकेशन पर प्रयुक्त होता है। स्टार्टअप समय 9 सेकंड से 5 सेकंड तक चला गया। इसके बारे में blog:

मुझे हाल ही में पता चला कि प्रदर्शन के लिए कितना महान एनजीएनएन हो सकता है। एप्लिकेशन जो मैं वर्तमान में काम करता हूं, में डेटा एक्सेस लेयर (डीएएल) है जो उत्पन्न हुआ है। डेटाबेस स्कीमा काफी बड़ा है, और हम सीधे डीएएल में कुछ डेटा (मूल्यों की सूची) उत्पन्न करते हैं। परिणाम: कई क्षेत्रों के साथ कई कक्षाएं, और कई विधियां। आवेदन को प्रोफाइल करते समय जेआईटी ओवरहेड अक्सर दिखाता है, लेकिन और एनजीएनएन संकलन करते हुए जेआईटी पर एक खोज के बाद हालांकि यह इसके लायक नहीं था। प्रबंधन के साथ इंस्टॉल-टाइम ओवरहेड, मेरी प्रमुख चिंता प्रबंधन ने मुझे पर संकेतों को अनदेखा कर दिया और इसके बजाय एप्लिकेशन में अधिक कार्यक्षमता जोड़ दी। जब हम "कोई भी सीपीयू" वास्तुकला बदल 64 बिट मशीनों बातें बदतर हो गई पर चल रहा है: हम अनुभव प्रोफाइलर समस्या क्षेत्र पर केवल JIT भूमि के ऊपर दिखा के साथ एक एकल कथन पर अप करने के लिए 10 सेकंड के लिए हमारे आवेदन में लटका, । एनजीएनई ने समस्या हल की: बयान 10 सेकेंड से 1 मिलीसेकंड तक चला गया। यह कथन स्टार्टअप-प्रक्रिया का हिस्सा नहीं था, इसलिए मैं यह पता लगाने के लिए उत्सुक था कि पूरे एप्लिकेशन को स्टार्टअप समय पर क्या कर सकता है। यह 8 सेकंड से 3.5 सेकंड तक चला गया।

निष्कर्ष: मैं वास्तव में एनजीएन को आपके आवेदन पर आज़माने की सलाह देता हूं!

+0

एनजीएनई सब कुछ का पतन स्मृति उपयोग है। एक प्रक्रिया के लिए, डीएलएल लगभग स्मृति को दोगुना करते हैं जब .NET के रूप में .NET ने MSIL और NGEN'd संस्करण को स्मृति में लोड किया होगा। यह अपरिहार्य है इसलिए यदि आपके पास एक प्रक्रिया मेमोरी सीमा है (उदा। 32-बिट 2 जीबी मेमोरी स्पेस सीमा), और एक बड़ा प्रोग्राम, एनजीईएन समस्या को बढ़ाता है। – Shiv

0

JIT संकलन के बारे में Mehrdad Afshari की टिप्पणी करने के लिए एक अतिरिक्त के रूप में। यदि XmlSerializer के माध्यम से और एक 64-बिट सिस्टम पर एक SGEN कई गुणों के साथ एक वर्ग serializing, NGEN कॉम्बो एक संभावित विशाल (हमारे मामले गीगाबाइट और मिनटों में) प्रभाव पड़ता है।

अधिक जानकारी यहां: XmlSerializer startup HUGE performance loss on 64bit systems विशेष रूप से निक मार्टिचेचेको का जवाब देखें।

0

हाँ, मैं यह एक छोटे से एक CPU- सघन exe के साथ और NGEN के साथ की कोशिश की यह थोड़ा धीमा हो गया था!

मैं स्थापित किया है और NGEN छवि कई बार की स्थापना रद्द और एक बेंचमार्क भाग गया।

निम्नलिखित समय मैं हमेशा मिला reproducable +/- 0.1s: बिना 33.9s,

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

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