C# استدعاء فئة/واجهة (الكود الأصلي ، التكلفة)
-
01-10-2019 - |
سؤال
لنفترض أن لدينا بعض الفئة 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 بشكل مختلف؟