سؤال

لنفترض أن لدينا بعض الفئة A التي تنفذ بعض الواجهة i

I i = new A();
i.method(); // example 1
A a = (A)i;
a.method() // example 2

رمز IL الذي تم إنشاؤه لكل مكالمة إلى "Method ()" هو نفسه ، ولكن أي واحد من الدعوات إلى الطريقة "الطريقة ()" لها تكلفة أكبر في التعليمات البرمجية الأصلية ولماذا؟

سيكون موضع تقدير أي مساعدة.

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

المحلول

عموما ، الدعوة إلى ((A)a).method() سيكون (من أي وقت مضى قليلاً) أسرع ، كما يعلم برنامج التحويل البرمجي JIT (بشكل ثابت) الطريقة الملموسة التي يجب استدعاؤها ، وبالتالي يمكن الاتصال A.method مباشرة. وصفها من خلال الواجهة I يتطلب فحص وقت التشغيل على النوع الفعلي للكائن الذي يشير إليه المرجع ، ثم إرسال هذا التنفيذ. ليس لدي أي مراجع لذلك ، رغم ذلك.

أعلم أن برنامج التحويل البرمجي Java Jit لديه بعض التحسينات في هذا الصدد ، مثل كل Method Call هي افتراضية - إنها تخمن وتخزين المؤخرات الأكثر استخدامًا لأسلوب واجهة معين ويقوم بتحسين هذه الحالة. لا يحتاج .NET JIT إلى هذا الأمر تقريبًا ، حيث يجب أن تكون الأساليب افتراضية بشكل صريح.

هذا هو كثيرا جدا حالة من التحسين الجزئي الذي لا ينبغي أن تقلق بشأنه.

نصائح أخرى

إذا كان رمز IL هو نفسه ، فسيتم (تكلفة) الكود الأصلي. لماذا يعاملهم JIT بشكل مختلف؟

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