سؤال

أسمع باستمرار مدى سوء استخدام الانعكاس.على الرغم من أنني عمومًا أتجنب التفكير ونادرًا ما أجد مواقف يستحيل فيها حل مشكلتي بدونها، كنت أتساءل...

بالنسبة لأولئك الذين استخدموا الانعكاس في التطبيقات، هل قمت بقياس نتائج الأداء، وهل الأمر سيئ جدًا حقًا؟

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

المحلول

إنها.لكن هذا يعتمد على ما تحاول القيام به.

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

ومع ذلك، إذا كنت تتأمل داخل سلسلة من الحلقات المتداخلة مع استدعاءات انعكاس لكل منها، فأنا أقول إنه يجب عليك إعادة النظر في الكود الخاص بك :)

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

نصائح أخرى

في حديثه أداء الأشياء اليومية, يوضح جيف ريختر أن استدعاء الطريقة عن طريق التفكير هو أمر يدور حول أبطأ 1000 مرة من تسميتها عادة.

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

سيعتمد أداء الانعكاس على التنفيذ (يجب تخزين الاستدعاءات المتكررة مؤقتًا، على سبيل المثال: entity.GetType().GetProperty("PropName")).نظرًا لأن معظم الانعكاس الذي أراه على أساس يومي يتم استخدامه لملء الكيانات من قارئات البيانات أو هياكل نوع المستودع الأخرى، فقد قررت قياس الأداء على وجه التحديد على الانعكاس عند استخدامه للحصول على خصائص الكائنات أو تعيينها.

لقد ابتكرت اختبارًا أعتقد أنه عادل لأنه يقوم بتخزين جميع المكالمات المتكررة مؤقتًا ويؤدي فقط إلى استدعاء SetValue أو GetValue الفعلي.كل الكود المصدري لاختبار الأداء موجود في bitbucket على: https://bitbucket.org/grenade/accessortest.التدقيق هو موضع ترحيب وتشجيع.

الاستنتاج الذي توصلت إليه هو أنه غير عملي ولا يوفر تحسينات ملحوظة في الأداء لإزالة الانعكاس في طبقة الوصول إلى البيانات التي تُرجع أقل من 100000 صف في الوقت الذي يتم فيه تنفيذ الانعكاس بشكل جيد.

Graph of time (y) against number of entities populated(x)

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

إذا لم تكن في حلقة، فلا تقلق بشأن ذلك.

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

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

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

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

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

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

المثال التالي قديم - كان صحيحًا في ذلك الوقت (2008)، ولكن تم إصلاحه منذ فترة طويلة في إصدارات CLR الأحدث.ومع ذلك، لا يزال التفكير بشكل عام أمرًا مكلفًا إلى حد ما!

مثال على ذلك:يجب ألا تستخدم أبدًا عضوًا تم تعريفه على أنه "كائن" في عبارة القفل (C#) / SyncLock (VB.NET) في التعليمات البرمجية عالية الأداء.لماذا؟نظرًا لأن CLR لا يمكنه قفل نوع القيمة، مما يعني أنه يجب عليه إجراء فحص نوع الانعكاس في وقت التشغيل لمعرفة ما إذا كان الكائن الخاص بك هو في الواقع نوع قيمة بدلاً من نوع مرجعي أم لا.

كما هو الحال مع كل الأشياء في البرمجة، عليك موازنة تكلفة الأداء مع أي فائدة مكتسبة.إن الانعكاس أداة لا تقدر بثمن عند استخدامها بحذر.لقد قمت بإنشاء مكتبة تعيين O/R في C# والتي تستخدم الانعكاس للقيام بالارتباطات.لقد نجح هذا بشكل رائع.تم تنفيذ معظم أكواد الانعكاس مرة واحدة فقط، لذلك كان أي نجاح في الأداء صغيرًا جدًا، لكن الفوائد كانت كبيرة.إذا كنت أكتب خوارزمية فرز متشابكة جديدة، فمن المحتمل ألا أستخدم الانعكاس، لأنه من المحتمل أن يكون حجمه سيئًا.

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

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

ولكن في معظم الحالات لا توجد مشاكل مع استخدام الانعكاس.إذا كانت حاجتك الوحيدة هي فحص بعض التجميعات فإنني أوصي بها مونو. سيسيل الذي هو غاية خفيفة الوزن وسريعة

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

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

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

كزة حول المصدر وإلقاء نظرة على ما يجري.

كما هو الحال مع كل شيء، الأمر كله يتعلق بتقييم الوضع.في دوت نتنوك هناك مكون أساسي إلى حد ما يسمى FillObject يستخدم الانعكاس لملء الكائنات من صفوف البيانات.

هذا سيناريو شائع إلى حد ما، وهناك مقالة على MSDN، استخدام الانعكاس لربط كائنات الأعمال بعناصر تحكم نموذج ASP.NET الذي يغطي مشاكل الأداء.

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

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

أعتقد أنك ستجد أن الإجابة هي أن الأمر يعتمد.إنها ليست مشكلة كبيرة إذا كنت تريد وضعها في تطبيق قائمة المهام الخاصة بك.إنها مشكلة كبيرة إذا كنت تريد وضعها في مكتبة Facebook الدائمة.

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