سؤال

يستخدم مصممنا مزيجا إلى نمط تطبيق WPF الخاص بنا. عندما يختار الموارد المحلية للعقارات، ستطبقها المزيج ك {DynamicResource} بدل من {StaticResource}. وبعد تخميني هو أن المزيج يفعل ذلك لأنه تمكن التطبيق من إعادة تشغيله في وقت التشغيل دون الحاجة إلى إعادة تشغيله.

سؤالي هو: هل هناك تكلفة أداء كبيرة لهذا البحث الإضافي؟ يجب أن نطلب من المصمم العودة وتدوي تغيير هذه الديناميات إلى الإحصاء؟

فيما يلي سؤال رائع حتى يفسر الفرق بين الأنواع: ما الفرق بين Staticresource و Dynamicresource في WPF؟

هل كانت مفيدة؟

المحلول

لسوء الحظ، هذه هي الحالة التي يصعب فيها القيام بمقارنة مباشرة من الأداء النسبي منذ المكان الذي سيظهر فيه أي تدهور هو عميق في محرك WPF. في الأيام الأولى من WPF، كان استخدام STATICRESOURCE واحدة من تغييرات ضبط الأداء القياسية التي تم التوصية بها وقد تميل إلى اتباعها بدقة في منظمتنا وتوصي به للآخرين. لقد أزعجت حقا من أن مزج كل شيء ديناميكي على الرغم من أن ذلك ساعده في تقديم موارد من الملفات الأخرى بشكل صحيح في وقت التصميم.

مع مرور الوقت لقد تغيرت وجهة نظري حول هذا، بسبب تجربة شخصية إلى حد ما، ولكن أيضا تعليقات من الناس على فريق مزيج في مايكروسوفت. كما تريد أن تدرك، يتم كتابة المزيج بالكامل في WPF ولديه سمة بديلة كاملة (LIGHT) التي يمكن إيقاف تشغيلها أثناء تشغيل التطبيق أثناء تشغيل التطبيق. هذا ممكن لأنهم استخدموا Dynamicresource لتصميمهم إلى حد كبير. وفقا لهم، هذا لم يسبب حقا لهم أي مشاكل بافي حقيقية. بالنظر إلى أن المزيج ربما يكون تطبيق WPF الأكثر استخداما على نطاق واسع، إلا أنني أميل إلى إعطاء وزن كبير لآرائهم.

الشيء الآخر الذي يجب مراعاته هو الفائدة الفعلية في Dynamicresource. تعد القدرة على تغيير التصميم على الطاير جزءا منه، ولكن أيضا المرونة التي يمنحكها في بناء التسلسل الهرمي للموارد يمكن أن تجعلها أسهل بكثير لإدارة الأساليب المشتركة. أنا متأكد من أنك قد توصلت إلى موقف فجر فيه مرجع ثابتة في وقت التشغيل لأن المورد الذي أشر إليه هو أن يتم تحميله في فرع مختلف من التسلسل الهرمي.

من الواضح أن Staticresource مفيد للغاية للإشارة إلى مفتاح معين تعرفه ستكون متاحة في الوقت المناسب. عندما الكتابة اليدوية XAML ما زلت أميل إلى استخدامها طوال الوقت. ولكن بالنظر إلى الإنتاجية التي تكسبها من وجود مصمم ينشئ XAML الخاص بك في مزيج، فإن أي مكاسب أداء صغيرة قد تحصل عليها ربما لا يستحق النفقات العامة للصيح اليد على أنها ثابتة.

نصائح أخرى

يقال إنه فرق أداء، ولكن سواء كان "كبير" يعتمد على عدد عمليات البحث الديناميكية التي تحدث. ما لم يكن لديك الآلاف من مراجع Dynamicresource، فمن المحتمل ألا يكون الأمر ملحوظا في كلتا الحالتين؛ إذا أدت الموارد الديناميكية أسوأ بكثير من تلك الثابتة، أظن أن مزيج سيكون أكثر تحفظا حول توليدها.

في الواقع، عندما ركضت اختبارا ساذجا، وجدت أن النتيجة الطرفية التي هربها Dynamicresource أسرع من StaticResource (مع 3000 مراجع الموارد، رأيت أوقات الحمل حول 200ms عندما استخدمت Dynamicresource لكل شيء مقابل حوالي 400ms للحصول على STATICRESOURCE).

كان هذا اختبارا غير واقعي لأسباب عديدة: كانت جميع المراجع نفس الشيء، كنت أشغل بموجب مصحح الأخطاء، وما إلى ذلك، وما إلى ذلك، لكنها تشير إلى ذلك، سيكون من السابق لأوانه وضع الجهد في تغيير إخراج المزيج "فقط في حالة" - - وهذا إذا لاحظت التباطؤ، فقد لا يكون الأمر بالضرورة خطأ مراجع Dynamicresource - دائما قياس!

لسوء الحظ إذا قمت بتغيير الموارد الديناميكية مرة أخرى إلى الإحصاء، فسوف يكسر المزيج. يبدو أن هذا صحيحا خاصة عند استخدام UserControls التي مرجعت الموارد الديناميكية، إذا قمت بتغييرها إلى ثابت، فلن يتم تقديم عنصر التحكم عند المستضاف داخل عنصر تحكم آخر في مزيج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top