سؤال

ما يلي TextBlocks' الارتباطات التكاليف المزيد من الأداء:

<Window  
  x:Name="Me"
  x:Class="MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  xmlns:src="clr-namespace:WpfApplication1" 
  Title="MainWindow">
  <StackPanel>
    <TextBlock Text="{Binding Title, ElementName=Me}"/>
    <TextBlock Text="{Binding Title, RelativeSource={RelativeSource AncestorType={x:Type src:MainWindow}}}"/>
  </StackPanel>    
</Window>

أنا متأكد من سؤالي قد يستغرق مختلفة عندما TextBlocks في ارتفاع مستوى تداخل وجود العديد من الأخوة والأخوات والأجداد.

الاعتبارات

(على أساس الأفكار الشخصية فقط, قد أكون مخطئا في كل واحدة!):

  • ElementName:

    • قد بحث ومقارنة الحالي العنصر إلى المزيد من التحكم من خلال جميع الأطفال الأشقاء والأعمام الأعمام كبيرة بما في ذلك الأجداد (ربما هناك HashTable من جميع المسجلين الأسماء؟)
    • الحصول على Name خاصية عنصر التحكم يجب أن تكلف أقل أداء من الدعوة GetType.
    • مقارنة سلسلة أرخص من مقارنة أنواع خاصة عندما تعلم أن معظم من الضوابط حتى لا يكون Name تعيين.
  • FindAncestor:

    • فقط من خلال تكرار الأجداد ، لا siblingls 'الأعمام', 'أبناء' الخ.
    • على الأرجح يستخدم GetType لتحديد ما سلف نوع ؛ GetType التكاليف المزيد من الأداء ثم بسيط Name الملكية جالبة (ربما DPs هي مختلفة؟)
هل كانت مفيدة؟

المحلول

انها عادة ما تكون فكرة سيئة أن نحاول الإجابة على هذا النوع من الشيء قبل يتجادلون حول الذي كنت أعتقد أنه سيكون أسرع.أفضل بكثير لبناء تجربة لقياس ذلك.

أنا تعديل الإعداد الخاص بك قليلا - أنا وضعت ذات الصلة Xaml في UserControl ومقيدة Name الملكية منذ UserControl لا Title مكان الإقامة.ثم كتب بعض التعليمات البرمجية إلى إنشاء مثيل جديد من التحكم و إضافة إلى واجهة المستخدم ، واستخدم Stopwatch قياس الوقت الذي يستغرقه بناء وتحميله.(أبدأ توقيت قبل إنشاء عنصر تحكم المستخدم و أتوقف عن بعد تحكم المستخدم يثير Loaded هذا الحدث.)

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

بعد عام 2000 التكرار ، ElementName نهج المتوسطات 887us.

بعد عام 2000 التكرار ، RelativeSource نهج المتوسطات 959us.

لذلك ElementName في هذه التجربة خاصة قليلا أسرع من RelativeSource.تحميل تافهة UserControl فقط Grid واحد TextBlock حيث هناك واحد فقط اسمه عنصر ، ElementName النهج يبدو أن تأخذ 92% من الوقت لتحميل أن RelativeSource النهج يأخذ.

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

كررت التجربة مع 10 TextBlocks بدلا من 1. ElementName ثم بلغ 2020us حين RelativeSource نهج متوسط 2073us مرة أخرى أكثر من 2000 التكرارات لكل الاختبارات.و الغريب أن هناك أصغر الفرق هنا ليس فقط من الناحية النسبية ، ولكن في مطلق - واحد-عنصر أمثلة أظهرت فرقا من 72us ، حيث عشر عنصرا أمثلة أظهرت فرقا من 53us.

بدأت أشك أنني مما تسبب مزيدا من التقلبات طريق تشغيل بلدي التجارب على الجهاز الرئيسي بدلا من تكوين بعناية مع القليل من الاشياء ممكن للحد من الضوضاء.

أكثر واحد الاختلاف:لا يزال مع 10 بد كتل النص ، أضفت عشرة فارغة غير مقيد اسمه كتل النص إلى عنصر تحكم المستخدم.الفكرة هنا أن أعرض المزيد من تسمية الأشياء ، ElementName الآن لتحديد موقع اسمه البند في غضون 11 تسمية الأشياء.متوسط ElementName هو الآن 2775us.على RelativeSource النهج مع هذه إضافية 10 يدعى عناصر خرج في 3041us.

مرة أخرى, وأظن تقلب على سطح المكتب آلة هنا - يبدو من الغريب أن RelativeSource كان أداء أسوأ بكثير من هنا في السيناريو الذي كان ينبغي أن يكون أكثر ElementName's ميزة.

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

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

حتى في الختام:الأداء هو الشيء الخطأ التركيز على هنا.اختيار أيهما يجعل لمزيد من رمز للقراءة.

نصائح أخرى

في وقت لاحق من الاثنين ، يحتاج إلى المشي على الشجرة المرئية بحثًا عن نوع أجداد معين ، حيث ينظر المسبق مباشرة إلى حلمي الأسماء للنافذة لكائن مسجل بهذا الاسم ... سيكون تخميني هو وقت لاحق أبطأ بشكل هامشي ... ومع ذلك ، لا أعتقد أنه سيكون هناك فرق كبير في الأداء.

أتمنى أن يساعد ذلك ،

AJ

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