2010-02-12 7 views
14

हमारा डिजाइनर हमारे WPF एप्लिकेशन को स्टाइल करने के लिए मिश्रण का उपयोग कर रहा है। जब वह गुणों के लिए स्थानीय संसाधन चुनता है, तो मिश्रण उन्हें {StaticResource} के बजाय {DynamicResource} के रूप में लागू करेगा। मेरा अनुमान है कि मिश्रण ऐसा करता है क्योंकि यह ऐप को पुनरारंभ किए बिना रनटाइम पर पुन: थीम करने में सक्षम बनाता है।क्या StaticResource के बजाय डायनामिक रिसोर्स में कोई महत्वपूर्ण प्रदर्शन लागत है?

मेरा प्रश्न है: क्या इस अतिरिक्त लुकअप के लिए एक महत्वपूर्ण प्रदर्शन लागत है? क्या हमें डिजाइनर से वापस जाने और उन गतिशीलता को स्टेटिक्स में मैन्युअल रूप से बदलने के लिए कहा जाना चाहिए?

यहाँ एक महान तो सवाल यह है कि प्रकार के बीच का अंतर बताते है: What's the difference between StaticResource and DynamicResource in WPF?

उत्तर

25

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

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

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

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

+0

आपके कथन के बारे में "स्पष्ट रूप से स्टेटिक रिसोर्स एक विशिष्ट कुंजी को इंगित करने के लिए बहुत उपयोगी है आप जानते हैं कि सही समय पर उपलब्ध होने जा रहा है। " क्या इसका मतलब यह है कि एक डायनामिक रिसोर्स संकलन-समय प्रकार की जांच खो देता है और रनटाइम में ले जाया जाता है? – scobi

+0

हां। ज्यादातर मामलों में एक डायनामिक रिसोर्स संदर्भ जिसे हल नहीं किया जाता है, उसे केवल डिफ़ॉल्ट मान (जैसे ब्रश के लिए ब्लैक) मिल जाएगा और उस कुंजी के लिए प्रतीक्षा करें जो इसे दिखाना चाहता है। संकलक के लिए उस स्थिति को मान्य करने के लिए वास्तव में कोई भी तरीका नहीं है। –

+0

वह बहुत उपयोगी था, धन्यवाद !! –

5

वहाँ एक प्रदर्शन अंतर होना कहा जाता है, लेकिन यह है कि क्या "महत्वपूर्ण" कितने गतिशील लुकअप हो रही हैं पर निर्भर करेगा। जब तक आपके पास हजारों डायनामिक रिसोर्स संदर्भ नहीं हैं, तो शायद यह किसी भी तरह से ध्यान देने योग्य नहीं होगा; यदि गतिशील संसाधनों ने स्थिर लोगों की तुलना में बहुत खराब प्रदर्शन किया है, तो मुझे संदेह है कि मिश्रण उन्हें उत्पन्न करने के लिए अधिक रूढ़िवादी होगा।

वास्तव में, जब मैं एक अनुभवहीन परीक्षण भाग गया, मैं counterintuitive नतीजा यह है कि DynamicResource जब मैं के लिए बनाम चारों ओर 400 मि.से सब कुछ के लिए इस्तेमाल किया DynamicResource भाग गया तेजी StaticResource से (3000 संसाधन संदर्भ के साथ, मैं लोड समय 200 मि.से चारों ओर देखा पाया StaticResource)।

यह कई कारणों से एक अवास्तविक परीक्षण था: सभी संदर्भ एक ही चीज़ के थे, मैं डीबगर आदि के तहत चल रहा था, लेकिन यह सुझाव देता है कि मिश्रण उत्पादन को बदलने में प्रयास करना समयपूर्व होगा " मामले में "- और यदि आप मंदी की सूचना देते हैं तो यह आवश्यक नहीं है कि डायनेमिक रिसोर्स संदर्भों की गलती हो - हमेशा मापें!

+1

मुझे लगता है कि गतिशील रेसौस बैकग्राउंड थ्रेड पर लोड होते हैं और केवल तभी लोड होते हैं जब उनका उपयोग करने वाली वस्तु विच्छेदन हो जाती है, इसलिए गति का परीक्षण बहुत कठिन –

1

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

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