2009-05-15 12 views
12

मैंने देखा कि WPF एप्लिकेशन स्टार्टअप कभी-कभी बहुत धीमी होती है। क्या किसी को पता है कि कारण तत्व प्रारंभिकरण या डीएलएल लोड हो रहा है या कुछ और?क्या WPF अनुप्रयोग स्टार्टअप धीमा करता है?

उत्तर

12

पाठ नीचे this MSDN article on Improving WPF applications startup time से निकाला गया था (संपादित करें: अब WPF Application Startup Time में विलय)

आवेदन स्टार्टअप समय

समय की राशि है कि एक WPF आवेदन के लिए आवश्यक है भिन्न हो सकते हैं शुरू करने के लिए। यह विषय विंडोज प्रेजेंटेशन फाउंडेशन (डब्ल्यूपीएफ) एप्लिकेशन के लिए अनुमानित और वास्तविक स्टार्टअप समय को कम करने के लिए विभिन्न तकनीकों का वर्णन करता है।

शीत स्टार्टअप और WarmStartup

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

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

स्प्लैश स्क्रीन के

मामलों में जहां एक आवेदन शुरू करने और पहले यूआई प्रदर्शित के बीच एक महत्वपूर्ण, अपरिहार्य देरी, एक स्प्लैश स्क्रीन का उपयोग करके कथित स्टार्टअप समय का अनुकूलन को लागू करें। उपयोगकर्ता दृष्टिकोण शुरू करने के तुरंत बाद यह दृष्टिकोण एक छवि प्रदर्शित करता है। जब एप्लिकेशन अपना पहला यूआई प्रदर्शित करने के लिए तैयार होता है, तो स्पलैश स्क्रीन फीड होती है। .NET Framework 3.5 SP1 में प्रारंभ करना, आप स्प्लैश स्क्रीन को लागू करने के लिए SplashScreen कक्षा का उपयोग कर सकते हैं। अधिक जानकारी के लिए, How to: Add a Splash Screen to a WPF Application देखें।

आप देशी Win32 ग्राफिक्स का उपयोग करके अपनी खुद की स्प्लैश स्क्रीन भी कार्यान्वित कर सकते हैं। Run विधि से पहले अपना कार्यान्वयन प्रदर्शित करें।

का विश्लेषण करें स्टार्टअप कोड

एक धीमी गति से ठंड स्टार्टअप के लिए कारण निर्धारित करें। डिस्क I/O जिम्मेदार हो सकता है, लेकिन यह हमेशा मामला नहीं है। आम तौर पर, आपको बाहरी संसाधनों जैसे नेटवर्क, वेब सेवाओं या डिस्क के उपयोग को कम करना चाहिए।

परीक्षण करने से पहले, सत्यापित करें कि कोई अन्य चल रहे एप्लिकेशन या सेवाएं प्रबंधित कोड या WPF कोड का उपयोग नहीं करती हैं।

रीबूट के तुरंत बाद अपना WPF एप्लिकेशन प्रारंभ करें, और यह निर्धारित करें कि इसे प्रदर्शित करने में कितना समय लगता है। यदि आपके आवेदन के बाद के सभी लॉन्च (गर्म स्टार्टअप) बहुत तेज हैं, तो आपके ठंड स्टार्टअप मुद्दे की संभावना आई/ओ के कारण होती है।

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

अनुकूलन मॉड्यूल लोड हो रहा है

ऐसी प्रोसेस एक्सप्लोरर (Procexp.exe) और Tlist.exe के रूप में उपकरण का उपयोग निर्धारित करने के लिए जो आपके आवेदन लोड मॉड्यूल। आदेश Tlist < पिड > किसी प्रक्रिया द्वारा लोड किए गए सभी मॉड्यूल दिखाता है।

उदाहरण के लिए, यदि आप वेब से कनेक्ट कर रहा नहीं कर रहे हैं और आप देखते हैं कि System.Web.dll भरी हुई है, तो आपके आवेदन इस विधानसभा का संदर्भ देता है में एक मॉड्यूल है। यह सुनिश्चित करने के लिए जांचें कि संदर्भ आवश्यक है।

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

आस्थगित करें प्रारंभ संचालन

के बाद मुख्य आवेदन खिड़की प्रदान की गई है जब तक प्रवर्तन कोड स्थगित करने पर विचार करें।

ध्यान रखें कि कक्षा के कन्स्ट्रक्टर के अंदर प्रारंभिकता की जा सकती है, और यदि प्रारंभिक कोड अन्य वर्गों का संदर्भ देता है, तो यह एक कैस्केडिंग प्रभाव पैदा कर सकता है जिसमें कई वर्ग रचनाकारों को निष्पादित किया जाता है।

बचें ऐप्लिकेशन कॉन्फ़िगरेशन

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

GAC

का उपयोग एक विधानसभा वैश्विक असेंबली कैश (GAC), वहाँ मजबूत नाम विधानसभाओं के हैश सत्यापन द्वारा और NGEN छवि मान्यता से अगर एक देशी छवि के लिए की वजह से देरी कर रहे हैं में स्थापित नहीं है, तो वह असेंबली कंप्यूटर पर उपलब्ध है। जीएसी में स्थापित सभी असेंबली के लिए मजबूत नाम सत्यापन छोड़ दिया गया है। अधिक जानकारी के लिए, Gacutil.exe (Global Assembly Cache Tool) देखें।

Ngen.exe उपयोग

आपके आवेदन पर मूल छवि जेनरेटर (Ngen.exe) का उपयोग पर विचार करें। Ngen.exe का उपयोग करने से अधिक डिस्क एक्सेस के लिए सीपीयू खपत का व्यापार होता है क्योंकि Ngen.exe द्वारा उत्पन्न मूल छवि MSIL छवि से बड़ी होने की संभावना है।

गर्म स्टार्टअप समय में सुधार करने के लिए, आप हमेशा की तरह, आपके आवेदन पर Ngen.exe का उपयोग करना चाहिए, क्योंकि इस से बचा जाता है आवेदन कोड के JIT संकलन के सीपीयू लागत।

कुछ ठंड स्टार्टअप परिदृश्यों में, Ngen.exe का उपयोग करके भी सहायक हो सकता है। ऐसा इसलिए है क्योंकि जेआईटी कंपाइलर (mscorjit.dll) को लोड नहीं किया जाना चाहिए।

दोनों एनजेन और जेआईटी मॉड्यूल होने का सबसे खराब प्रभाव हो सकता है। ऐसा इसलिए है क्योंकि mscorjit.dll को लोड किया जाना चाहिए, और जब जेआईटी कंपाइलर आपके कोड पर काम करता है, तो जेआईटी कंपाइलर असेंबली के मेटाडेटा को पढ़ता है जब Ngen छवियों में कई पेजों का उपयोग किया जाना चाहिए।

NGEN और ClickOnce

जिस तरह से आप अपने आवेदन भी लोड समय में एक फर्क कर सकते हैं तैनात करने की योजना है। क्लिकऑन एप्लिकेशन परिनियोजन Ngen का समर्थन नहीं करता है। यदि आप अपने आवेदन के लिए Ngen.exe का उपयोग करने का निर्णय लेते हैं, तो आपको विंडोज इंस्टालर जैसे अन्य परिनियोजन तंत्र का उपयोग करना होगा।

अधिक जानकारी के लिए, Ngen.exe (Native Image Generator) देखें।

रिबेसिंग और DLL पता टक्कर

आप Ngen.exe का उपयोग करते हैं, ध्यान रखें कि रिबेसिंग हो सकता है जब देशी छवियों स्मृति में लोड कर रहे हैं। यदि एक डीएलएल अपने पसंदीदा आधार पते पर लोड नहीं होता है क्योंकि वह पता सीमा पहले ही आवंटित की जाती है, तो विंडोज लोडर इसे दूसरे पते पर लोड करेगा, जो समय लेने वाला ऑपरेशन हो सकता है।

आप वर्चुअल एड्रेस डंप (Vadump.exe) टूल का उपयोग यह जांचने के लिए कर सकते हैं कि मॉड्यूल हैं या नहीं, जिसमें सभी पृष्ठ निजी हैं। यदि ऐसा है, तो मॉड्यूल को एक अलग पते पर पुनर्निर्मित किया जा सकता है। इसलिए, इसके पृष्ठों को साझा नहीं किया जा सकता है।

आधार पता सेट करने के तरीके के बारे में अधिक जानकारी के लिए, Ngen.exe (Native Image Generator) देखें।

अनुकूलन एथेंटिकोड

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

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

.NET Framework   3.5 में प्रारंभ, एक कॉन्फ़िगरेशन विकल्प है जो प्रमाणीकरण सत्यापन को बाईपास करने की अनुमति देता है। ऐसा करने के लिए, app.exe.config फ़ाइल में निम्न सेटिंग को जोड़ने:

<configuration> 
<runtime> 
    <generatePublisherEvidence enabled="false"/> 
    </runtime> 
</configuration> 

प्रदर्शन की तुलना करें Windows Vista

पर Windows Vista में स्मृति प्रबंधक एक प्रौद्योगिकी SuperFetch कहा जाता है। सुपरफ़ेच एक विशिष्ट उपयोगकर्ता के लिए इष्टतम स्मृति सामग्री निर्धारित करने के लिए समय के साथ स्मृति उपयोग पैटर्न का विश्लेषण करता है। यह हर समय उस सामग्री को बनाए रखने के लिए लगातार काम करता है।

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

उपयोग AppDomains कुशलतापूर्वक

संभव हो तो, एक डोमेन तटस्थ कोड क्षेत्र में लोड विधानसभाओं सुनिश्चित करें कि देशी छवि, यदि कोई है, आवेदन में बनाए गए सभी AppDomains में प्रयोग किया जाता है बनाने के लिए।

सर्वोत्तम प्रदर्शन के लिए, क्रॉस-डोमेन कॉल को कम करके कुशल क्रॉस-डोमेन संचार लागू करें। जब संभव हो, तर्कों के बिना या आदिम प्रकार के तर्कों के बिना कॉल का उपयोग करें।

उपयोग NeutralResourcesLanguage ResourceManager के लिए तटस्थ संस्कृति निर्दिष्ट करने के लिए गुण

उपयोग NeutralResourcesLanguageAttribute। यह दृष्टिकोण असफल असेंबली लुकअप से बचाता है।

क्रमबद्धता

के लिए BinaryFormatter कक्षा का प्रयोग करें आप क्रमबद्धता उपयोग करना आवश्यक है, के बजाय BinaryFormatter वर्ग XmlSerializer वर्ग का उपयोग करें। Mscorlib.dll असेंबली में बेस क्लास लाइब्रेरी (बीसीएल) में BinaryFormatter कक्षा लागू की गई है। XmlSerializer System.Xml.dll असेंबली में कार्यान्वित किया गया है, जो लोड करने के लिए एक अतिरिक्त DLL हो सकता है।

यदि आपको XmlSerializer कक्षा का उपयोग करना होगा, तो आप बेहतर प्रदर्शन प्राप्त कर सकते हैं यदि आप धारावाहिक असेंबली को पूर्व-उत्पन्न करते हैं।

कॉन्फ़िगर ClickOnce

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

यदि आप एक्सएएमएल ब्राउज़र एप्लिकेशन (एक्सबीएपी) मॉडल का उपयोग करते हैं, तो ध्यान रखें कि क्लिकऑन अपडेट के लिए तैनाती साइट की जांच करता है भले ही एक्सबीएपी पहले से ही क्लिकऑन कैश में है। अधिक जानकारी के लिए, ClickOnce Security and Deployment देखें। PresentationFontCache सेवा स्वचालित रूप से

पहले WPF आवेदन एक रिबूट के बाद PresentationFontCache सेवा है चलाने के लिए शुरू करने के लिए

कॉन्फ़िगर। सेवा सिस्टम फोंट को कैश करती है, फ़ॉन्ट एक्सेस में सुधार करती है, और समग्र प्रदर्शन में सुधार करती है। सेवा शुरू करने में एक ओवरहेड है, और कुछ नियंत्रित वातावरण में, सिस्टम रीबूट होने पर स्वचालित रूप से प्रारंभ करने के लिए सेवा को कॉन्फ़िगर करने पर विचार करें।

सेट डाटा इसके बजाय XAML का उपयोग कर, मुख्य विंडो के लिए एलान के तौर पर DataContext सेट OnActivated विधि में प्रोग्राम के रूप में यह सेट करने पर विचार के प्रोग्राम बाइंडिंग

+2

यह आलेख आधिकारिक WPF MSDN दस्तावेज़ में विलय कर दिया गया था - http://msdn.microsoft.com/en-us/library/cc656914.aspx – splintor

2

यदि आप फ्रेमवर्क 3.51 का उपयोग करते हैं और 3.5 या 3.0 नहीं करते हैं तो एक WPF अनुप्रयोग का स्टार्टअप समय बहुत तेज हो सकता है। 3.51 वास्तव में एक सुधार है।

0

स्टुअर्ट लिंक XmlSerializer चाल से उत्कृष्ट लेख से मुझे सबसे ज्यादा मदद मिली। वह वास्तव में कुछ सेकंड मुंडा।रन "NGEN   अद्यतन" हर ढांचे फ़ोल्डर में: इसके अलावा डीफ्रैगमेन्टिंग अपने HD :-)

0

सबसे अधिक उपयोगी सलाह WPF स्टार्टअप प्रदर्शन मैंने आज तक देखा in this other question दिया गया था ठीक करने का प्रयास कम मत समझो।

ऐसा लगता है कि माइक्रोसॉफ्ट अपने एनजेन कैश को अद्यतित नहीं रख सकता है, जिसके परिणामस्वरूप आपका एप्लिकेशन हर एक स्टार्टअप के .NET फ्रेमवर्क के आधे से अधिक recompiling परिणामस्वरूप।

विश्वास करना मुश्किल है, लेकिन यह सच है।

0

यह एक पुराना धागा है, लेकिन मैं अपने Win10 सिस्टम पर WPF ऐप्स के साथ स्टार्टअप प्रदर्शन समस्या को ठीक करने का प्रयास करते समय कई बार समाप्त हुआ हूं, इसलिए मैंने सोचा कि मैं एक उत्तर दूंगा जो दूसरों की मदद कर सकता है - एक उत्तर जो इस सिस्टम पर सभी WPF ऐप्स के लिए केवल कुछ मिलीसेकंड तक एक भयानक 5 सेकंड स्टार्टअप समय लेता है। एनवीडिया "3 डी विजन" ड्राइवर हटाएं। मेरे पास एक GeForce GTX 650 कार्ड है, और "3 डी विजन" ड्राइवर कुछ भी उपयोगी नहीं प्रतीत होता है, इसलिए इसे हटाने से मेरे लिए कोई समस्या नहीं है। VisualStudio2015 प्रदर्शन विश्लेषण टूल ने आखिरकार यह दिखाने में मदद की कि लगभग 5 सेकंड स्टार्टअप समय को nvapi64.dll - nVidia ड्राइवर के माध्यम से कॉल के बाद IDLE खर्च किया गया था। वाह।

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