2010-11-08 6 views
10

मुझे यहां अपने हाथों पर एक गंभीर सिर-स्क्रैचर मिला है। मैं अपने आवेदन में एक डब्ल्यूपीएफ घटक के साथ प्रदर्शन मुद्दों की जांच कर रहा हूं।GetMessageW मेरे WPF एप्लिकेशन में बड़े पैमाने पर CPU उपयोग क्यों लेगा?

हमारा .net एप्लिकेशन बहुत बड़ा है, और लगभग पूरी तरह से विंडोज़ रूपों में है। एक नई पहल के हिस्से के रूप में हम एक समृद्ध WPF ui के साथ हमारे मूल घटकों में से एक को फिर से लिखते हैं। WinForms < के बहुत सारे हैं -> इस बात के साथ WPF इंटरऑप इस पर चिपकने के लिए आगे बढ़ रहा है, और मुझे संदेह है कि जो कुछ भी मैं देख रहा हूं उससे संबंधित हो सकता है।

जब मैं एएनटीएस प्रोफाइलर में धीमी गति से ऑपरेशन करता हूं, तो मुझे फ़ंक्शन के अंदर बहुत सारी गतिविधि होती है UnsafeNativeMethods.IntGetMessageW। एएनटीएस रिपोर्ट करता है कि जितनी सीपीयू गतिविधि वहां जा रही है क्योंकि यह हमारे सभी व्यावसायिक तर्क और डब्ल्यूपीएफ प्रतिपादन सामग्री को जोड़ती है। चक्र का उपयोग कर रहे उस फ़ंक्शन का कोई प्रबंधित कोड डाउनलाइन नहीं है, इसलिए जो भी IntGetMessageW कर रहा है वह वही है जो मैं कर रहा हूं।

मैं Win32 प्रोग्रामिंग में विशेष रूप से अच्छी तरह से ज्ञात नहीं हूं, लेकिन मुझे उस संदर्भ में एक संदेश लूप की मूल बातें पता है। जो कुछ भी मैं यहां देख रहा हूं वह कुछ भी है जो हम मैन्युअल रूप से करते हैं - हमारे कोड में किसी भी समय हम अंतर्निहित मैसेजेलोप के साथ सीधे बातचीत नहीं कर रहे हैं, या किसी भी जटिल सामग्री को WPF प्रेषक पर पहुंचा जा सकता है।

यहां प्रश्न में हमारे डब्ल्यूपीएफ घटक को विंडो से विरासत में लिखा गया है (यानी यह केवल एक नियंत्रण/उपयोगकर्ता नियंत्रण नहीं है), और हम इसे अपने उच्च स्तरीय तर्क से शोडियलॉग का उपयोग करके दिखाते हैं जो पुराने WinForms संस्करण पर ShowDialog को कॉल करने के लिए उपयोग किया जाता था यह घटक कुछ WindowsFormsIntegrationHost नियंत्रण हैं जिन्हें हमने WPF घटक के अंदर उपयोग किया है ताकि हमारे कुछ मौजूदा टुकड़ों के साथ संगतता को संरक्षित किया जा सके जिन्हें WPF में पुनः लिखा नहीं जा सके।

मैं इसे दिनों के लिए शोध कर रहा हूं, लेकिन इसे कभी भी पूरा करने के लिए बहुत कुछ नहीं मिला है। मैं अस्पष्ट संबंधित पोस्टिंग ढूंढता रहता हूं जो इनपुट संदेशों (माउस और कीबोर्ड) के बारे में बात करते हैं, लेकिन मुझे नहीं पता कि मैं इसे सत्यापित करने के लिए क्या कर सकता हूं; मैंने पहले से ही हर माउस/कीबोर्ड ऑपरेशन को हटाने के लिए कोड को कुचलने की कोशिश की है।

मुझे मुख्य रूप से कहीं भी मुश्किल समय मिल रहा है क्योंकि कोड की यह पंक्ति पूरी तरह से अलग है (माता-पिता या कुछ भी नहीं जो मैं वास्तव में हमारे कोड से आ रहा हूं), और यह पूरी तरह से अपमानजनक है कि यह क्या कर रहा है । alt text

मैं पूरी तरह से समझते हैं कि यह कुछ सिर्फ WPF के हिस्से के रूप किया जा सकता है कि हो सकता है कि:

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

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

alt text

देख के लिए धन्यवाद!

+0

यह एक WPF ऐप के लिए सामान्य प्रदर्शन है। डब्ल्यूपीएफ/सिल्वरलाइट टीम पर कोई भी सुन रहा है? – MedicineMan

उत्तर

0

मैं इस, जबकि एक ही मुद्दे के बारे में जानकारी के लिए खोज पाया।मैं जो जोड़ता हूं उसे जोड़ दूंगा और देख सकता हूं कि यह मदद करता है:

मैं एक WinXP बॉक्स पर चल रहा हूं - डब्ल्यूपीएफ फ्रेमवर्क Vista और Win7 में XP से अधिक एकीकृत है। इनमें से कुछ इस बात के कारण हो सकते हैं कि डब्ल्यूपीएफ इसके बजाय एक्सपी डेस्कटॉप के "शीर्ष पर" कैसे चलता है।

मैं एक शुद्ध देशी WPF अनुप्रयोग चला रहा हूं - बिना WinForms या अन्य कोड के।

मैं यह निर्धारित करने की कोशिश में भाग गया कि एक खिड़की को स्क्रॉल करने से यह 100% सीपीयू और स्टटर का उपभोग क्यों करेगा।

एकटाइम प्रदर्शन प्रोफाइलर चलाना, मुझे लगता है कि IntGetMessageW उस 100% CPU उपयोग का सबसे बड़ा हिस्सा है। यह IntGetMessageW किसी संदेश के लिए प्रतीक्षा करने के कारण नहीं है, लेकिन वास्तव में कुछ फ़ंक्शन वास्तव में कर रहा है।

एक बात जो मैंने अभी तक नहीं देखी है वह यह है कि शायद IntGetMessageW कभी भी एक तेज विधि नहीं रहा है, और शायद डब्ल्यूपीएफ बस इसे ओवरसिस कर सकता है। यह संभव है कि WPF में डेटा बाइंडिंग WPF के भीतर निर्भरता गुणों को अद्यतन करने के लिए मूल Win32 संदेश पंप का उपयोग करें। यदि ऐसा है, तो यह हो सकता है कि मेरी खिड़की में बस कई बाइंडिंग हों।

0

ऐसा लगता है कि आपका संदेश पंप बहुत पंप कर रहा है। यह देखने के लिए दिलचस्प हो सकता है कि आपका संदेश कतार किस तरह का संदेश भरा हुआ है। क्या आप चल रहे हैं यह देखने के लिए आप अपनी विंडो पर जासूस ++ का उपयोग कर सकते हैं?

संपादित

मैं इस समस्या को गलत समझा गया है।

हंस पासेंट सही है, आपका प्रोग्राम बस कुछ घटनाओं के लिए GetMessage पर प्रतीक्षा कर रहा है।

3

हां, यह सामान्य है। कोई भी जीयूआई ऐप हमेशा GetMessageW() निष्पादित करता है, विंडोज़ को इसे एक संदेश भेजने का इंतजार कर रहा है। यह वास्तव में ऐसा करने वाले CPU चक्रों को जलाना नहीं है, केवल एक आंतरिक सिंक्रनाइज़ेशन ऑब्जेक्ट पर अवरुद्ध है जब तक कि किसी प्रकार का UI ईवेंट संकेत न हो।

यह निश्चित रूप से प्रोफाइलिंग यूआई ऐप्स को मुश्किल बनाता है, आपको वास्तव में यूनिट परीक्षणों की आवश्यकता होती है जो आपके ऐप के उप-संयोजकों का परीक्षण करती हैं।

+0

यह पहली बात थी जिस पर मुझे संदेह था, लेकिन मुझे भ्रमित करने का कारण यह है कि एएनटीएस हमारे किसी भी अन्य WPF घटकों के लिए महत्वपूर्ण गेटमेज सीपीयू गतिविधि नहीं दिखाता है। एक समान समान जटिल घटक में, लगभग एक ही समय में एक ऑपरेशन IntGetMessageW में 0.02% CPU उपयोग दिखाता है, जबकि उपर्युक्त उदाहरण में लगभग 60% CPU उपयोग एएनटीएस में दिखाया जाता है। –

1

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

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

आपको पहले अपना कोड संदिग्ध करके शुरू करना चाहिए। यह दुर्लभ है कि WPF या Win32 आधारभूत संरचना जैसे कुछ खराब प्रदर्शन या उच्च CPU उपयोग के लिए ज़िम्मेदार है। संभावना है कि समस्या आपके कार्यान्वयन में कहीं भी है - इससे आपको अपने कार्यक्रम में सीपीयू चक्रों का खर्च करने की पूरी समझ मिलती है।

मेरा सुझाव है कि आप कुछ प्रभावी होने के लिए कुछ समय learning the capabilities of the profiler भी खर्च करें। प्रोफाइलर परिष्कृत और भ्रमित उपकरण हो सकते हैं जब तक कि आप समझ न सकें कि वे आपको दिखाने की कोशिश कर रहे हैं। रेडगेट से जुड़ा हुआ ट्यूटोरियल शुरू करने के लिए एक अच्छी जगह होनी चाहिए, अगर आपने पहले से ऐसा नहीं किया है। उदाहरण के लिए, टाइमलाइन व्यू वास्तव में यह देखने के लिए एक अच्छी जगह हो सकती है कि उच्च-CPU गतिविधि कहां हो रही है, और निष्पादित कोड के उन हिस्सों में आपके विश्लेषण को सीमित कर रहा है। के रूप में यह आपकी मदद करता है कि सबसे अधिक महंगे हैं कोड के क्षेत्रों में और गहराई

alt text

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

alt text

+0

मैं एएनटीएस से काफी परिचित हूं, और यह आपको परिणामों में कार्यों में खर्च किए गए CPU समय और वॉल क्लॉक समय को देखने के बीच अंतर करने की अनुमति देने के लिए स्थापित किया गया है। यदि एएनटीएस इन परिणामों की रिपोर्टिंग को हमेशा अतीत में (यानी जब तक यह डेटा को गलत तरीके से प्रस्तुत नहीं कर रहा है) तो यह निश्चित रूप से बहुत सी CPU उपयोग दिखा रहा है (मैं इन परिणामों में लगभग 50% देखता हूं, अन्य 50 के साथ % हमारे व्यापार तर्क के लिए जा रहा है)। क्या GetMessage CPU गहन कार्यों को करने के लिए संभव है? मैंने परिणामों से अधिक जानकारी दिखाने के ऊपर एक और छवि शामिल की है। –

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