ما هو الأداء الذي ضرب مع الانزلاق؟
سؤال
مجرد محاولة للحصول على رأسي حول الأدوية من خلال القراءة هذه المقالة المنير من قبل Juval Lowy
إعادة الصياغة .. عندما تحدد تعريف فئة عامة ، يتم تجميعه في IL.
- بالنسبة إلى أنواع القيمة ، بمجرد أن تطلب الحصول على نوع معين من القيمة ، فإنه يحل محل T مع نوع القيمة المحددة للحصول على IL لهذا التكوين المحدد على سبيل المثال
MyList<int>
الاستفادة: لا توجد عقوبات ملاكمة وعدالة. - كل شيء جيد .. بالنسبة للأنواع المرجعية ، يحل المترجم محل جميع مثيلات T في التعريف الخاص بك مع الكائن ويقوم بإنشاء IL الذي يستخدم لجميع أنواع المرجع. ومع ذلك ، يتم تخصيص الحالات بناءً على نوع المرجع الفعلي المطلوب على سبيل المثال
MyList<String>
الآن ما قبل التحريكات ، يمكن أن يكون لدينا أساليب تكتب Object
المعلمات. تدعي الأداء الأداء تحسين الأداء بنسبة 100 ٪ بسبب 'إنه يتجنب عقوبة الأداء التي تتحملها عند تسليط نوع الكائن إلى نوعك المحدد عندما تريد استخدامه "
// assume GetItem returns an Object
string sMyPreciousString = (string) obList.GetItem();
ما الذي ضرب هذا الأداء عندما تنهار من كائن إلى نوع مرجعي محدد؟ كما أنه يبدو أن الأمر متروك للكائنات (حتى الأدوية الجنيسة ستفعل هذا) ، فليس من النجاح في الأداء .. لماذا؟
المحلول
لا يتطلب الأمر إلى الكائن فحص وقت التنفيذ - فهو سيعمل دائمًا ، وهو مجرد عدم وجود OP بشكل أساسي.
يتطلب الانزلاق فحص وقت التنفيذ للتأكد من أنك لا تدفع دفقًا إلى سلسلة على سبيل المثال. إنها عقوبة صغيرة جدًا ، ومن غير المرجح أن تكون عنق الزجاجة - ولكن تجنبها ليست سوى فائدة إضافية للوظائف العامة.
نصائح أخرى
يأتي ضرب الأداء من الحاجة إلى فحص نوع وقت التشغيل. إذا كانت B عبارة عن فئة فرعية من A ، ثم عندما تقوم بإلقاء A في A ، فأنت تعرف في وقت الترجمة أن تكون آمنة ، لأن جميع BS هي. لذلك ، لا تحتاج إلى إنشاء أي رمز وقت تشغيل للتحقق من النوع.
ومع ذلك ، عندما تقوم بإلقاء A في A B ، فأنت لا تعرف في وقت الترجم ما إذا كان A هو في الواقع ب أم لا. قد يكون مجرد A ، قد يكون من النوع C ، وهو نوع فرعي مختلف من A. لذلك ، تحتاج إلى إنشاء رمز وقت تشغيل من شأنه التأكد من أن الكائن هو في الواقع B ورمي استثناء إذا لم يكن كذلك.
لا تواجه الأدوية الجنيسة هذه المشكلة ، لأن المترجم يعرف ، في وقت الترجمة ، أنه تم وضع BS فقط في بنية البيانات ، لذلك عندما تقوم بسحب شيء ما ، يعرف المترجم أنه سيكون B ، لذلك ليست هناك حاجة ل اكتب التحقق في وقت التشغيل.
القراءة على IL التي يتم إنشاؤها (هذا مقالة - سلعة يذكر ذلك) ... آها - Isinst.
إذا لم تكن مهرجًا ، فلن تضطر إلى الاتصال isinst.