मुझे यहां अपने हाथों पर एक गंभीर सिर-स्क्रैचर मिला है। मैं अपने आवेदन में एक डब्ल्यूपीएफ घटक के साथ प्रदर्शन मुद्दों की जांच कर रहा हूं।GetMessageW मेरे WPF एप्लिकेशन में बड़े पैमाने पर CPU उपयोग क्यों लेगा?
हमारा .net एप्लिकेशन बहुत बड़ा है, और लगभग पूरी तरह से विंडोज़ रूपों में है। एक नई पहल के हिस्से के रूप में हम एक समृद्ध WPF ui के साथ हमारे मूल घटकों में से एक को फिर से लिखते हैं। WinForms < के बहुत सारे हैं -> इस बात के साथ WPF इंटरऑप इस पर चिपकने के लिए आगे बढ़ रहा है, और मुझे संदेह है कि जो कुछ भी मैं देख रहा हूं उससे संबंधित हो सकता है।
जब मैं एएनटीएस प्रोफाइलर में धीमी गति से ऑपरेशन करता हूं, तो मुझे फ़ंक्शन के अंदर बहुत सारी गतिविधि होती है UnsafeNativeMethods.IntGetMessageW। एएनटीएस रिपोर्ट करता है कि जितनी सीपीयू गतिविधि वहां जा रही है क्योंकि यह हमारे सभी व्यावसायिक तर्क और डब्ल्यूपीएफ प्रतिपादन सामग्री को जोड़ती है। चक्र का उपयोग कर रहे उस फ़ंक्शन का कोई प्रबंधित कोड डाउनलाइन नहीं है, इसलिए जो भी IntGetMessageW कर रहा है वह वही है जो मैं कर रहा हूं।
मैं Win32 प्रोग्रामिंग में विशेष रूप से अच्छी तरह से ज्ञात नहीं हूं, लेकिन मुझे उस संदर्भ में एक संदेश लूप की मूल बातें पता है। जो कुछ भी मैं यहां देख रहा हूं वह कुछ भी है जो हम मैन्युअल रूप से करते हैं - हमारे कोड में किसी भी समय हम अंतर्निहित मैसेजेलोप के साथ सीधे बातचीत नहीं कर रहे हैं, या किसी भी जटिल सामग्री को WPF प्रेषक पर पहुंचा जा सकता है।
यहां प्रश्न में हमारे डब्ल्यूपीएफ घटक को विंडो से विरासत में लिखा गया है (यानी यह केवल एक नियंत्रण/उपयोगकर्ता नियंत्रण नहीं है), और हम इसे अपने उच्च स्तरीय तर्क से शोडियलॉग का उपयोग करके दिखाते हैं जो पुराने WinForms संस्करण पर ShowDialog को कॉल करने के लिए उपयोग किया जाता था यह घटक कुछ WindowsFormsIntegrationHost नियंत्रण हैं जिन्हें हमने WPF घटक के अंदर उपयोग किया है ताकि हमारे कुछ मौजूदा टुकड़ों के साथ संगतता को संरक्षित किया जा सके जिन्हें WPF में पुनः लिखा नहीं जा सके।
मैं इसे दिनों के लिए शोध कर रहा हूं, लेकिन इसे कभी भी पूरा करने के लिए बहुत कुछ नहीं मिला है। मैं अस्पष्ट संबंधित पोस्टिंग ढूंढता रहता हूं जो इनपुट संदेशों (माउस और कीबोर्ड) के बारे में बात करते हैं, लेकिन मुझे नहीं पता कि मैं इसे सत्यापित करने के लिए क्या कर सकता हूं; मैंने पहले से ही हर माउस/कीबोर्ड ऑपरेशन को हटाने के लिए कोड को कुचलने की कोशिश की है।
मुझे मुख्य रूप से कहीं भी मुश्किल समय मिल रहा है क्योंकि कोड की यह पंक्ति पूरी तरह से अलग है (माता-पिता या कुछ भी नहीं जो मैं वास्तव में हमारे कोड से आ रहा हूं), और यह पूरी तरह से अपमानजनक है कि यह क्या कर रहा है ।
मैं पूरी तरह से समझते हैं कि यह कुछ सिर्फ WPF के हिस्से के रूप किया जा सकता है कि हो सकता है कि:
यहाँ एक चींटियों की एक छवि कॉल का रास्ता दिखा रहा यहां पहुंचने के लिए ShowDialog समारोह का ग्राफ कहते हैं (हालांकि डब्ल्यूपीएफ में हमने जो अन्य componenets लिखा है, वे इस व्यवहार को प्रदर्शित नहीं करते हैं), या यह एएनटीएस प्रोफाइलर में बस एक बहुत ही अजीब बग है, लेकिन इस बिंदु पर मुझे इसे एक या दूसरे तरीके से सत्यापित करने की आवश्यकता है। अगर कोई मुझे बता सकता है कि यहां क्या हो रहा है या हो सकता है - या मुझे किसी तरह से इंगित करें, तो मैं इसे स्वयं समझने में सक्षम हूं, मैं आपके सभी प्रकार के अच्छे कर्मों को अपना रास्ता निर्देशित करूंगा।
अद्यतन: नीचे कुछ चर्चा के जवाब में, यहाँ चीटियों से एक और दृश्य है - यह एक बेहतर भ्रम मैं कर रहा हूँ (इस चींटियों के साथ "CPU समय" मोड में देखने) को दिखाता है। मैं जल्दी से सेंसर किया है हमारे कोड के कुछ हिस्सों, लेकिन प्रणाली संबंधित कार्यों में से कोई भी:
देख के लिए धन्यवाद!
यह एक WPF ऐप के लिए सामान्य प्रदर्शन है। डब्ल्यूपीएफ/सिल्वरलाइट टीम पर कोई भी सुन रहा है? – MedicineMan