هل تمنع الواجهات العامة في C# الملاكمة؟(أداء .NET مقابل الأداء الأحادي)

StackOverflow https://stackoverflow.com/questions/139979

سؤال

لدي واجهة C# مع معلمات طريقة معينة تم الإعلان عنها على أنها object أنواع.ومع ذلك، فإن النوع الفعلي الذي تم تمريره يمكن أن يختلف اعتمادًا على الفئة التي تنفذ الواجهة:

public interface IMyInterface
{
    void MyMethod(object arg);
}

public class MyClass1 : IMyInterface
{
    public void MyMethod(object arg)
    {
        MyObject obj = (MyObject) arg;
        // do something with obj...
    }
}

public class MyClass2 : IMyInterface
{
    public void MyMethod(object arg)
    {
        byte[] obj = (byte[]) arg;
        // do something with obj...
    }
}

المشكلة في MyClass2 هي أن تحويل byte[] من وإلى object يكون الملاكمة والفتح, ، وهي عمليات مكلفة حسابيًا تؤثر على الأداء.

هل سيتم حل هذه المشكلة مع أ واجهة عامة تجنب الملاكمة/الفتح؟

public interface IMyInterface<T>
{
    void MyMethod(T arg);
}

public class MyClass1 : IMyInterface<MyObject>
{
    public void MyMethod(MyObject arg)
    {
        // typecast no longer necessary
        //MyObject obj = (MyObject) arg;
        // do something with arg...
    }
}

public class MyClass2 : IMyInterface<byte[]>
{
    public void MyMethod(byte[] arg)
    {
        // typecast no longer necessary
        //byte[] obj = (byte[]) arg;
        // do something with arg...
    }
}

كيف يتم تنفيذ ذلك في .NET vs Mono؟هل سيكون هناك أي آثار على الأداء على أي من النظامين الأساسيين؟

شكرًا لك!

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

المحلول

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

ولهذا السبب حققت مكتبة Collections.Generic نجاحًا كبيرًا في .NET 2.0 لأن المجموعات لم تعد تتطلب الملاكمة وأصبحت أكثر كفاءة بشكل ملحوظ.

نصائح أخرى

سوف تحصل على نفس المزايا في Mono التي تحصل عليها في .NET.

نوصي بشدة باستخدام Mono 1.9 أو Mono 2.0 RCx بشكل عام، نظرًا لأن الأدوية العامة تدعم الإصدار 1.9 فقط.

المشكلة في MyClass2 هي أن تحويل البايت [] من وإلى الكائن هو الملاكمة والملاكمة ، والتي هي عمليات باهظة الثمن من الناحية الحسابية التي تؤثر على الأداء.

لا توجد ملاكمة مع أنواع المصفوفات، حتى تلك التي تحتوي على عناصر نوع القيمة.المصفوفة هي نوع مرجعي.

الحمل على (byte[]) arg هو الحد الأدنى في أحسن الأحوال.

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

لا أستطيع التحدث إلى Mono، ولكن باستخدام واجهة عامة يجب حل مشكلة الملاكمة/الفتح في وقت تشغيل MS.

نظرًا لأنك تستخدم إصدارًا حديثًا من mono، 2.0 إذا استطعت.

أداء الواجهة العامة على Mono جيد جدًا، عند اقترانه بإرسال الواجهة العادية.

يعد إرسال الأساليب الافتراضية العامة[1] أمرًا فظيعًا في جميع الإصدارات التي تم إصدارها من mono، وقد تحسن في 1.9 ألف.

المشكلة ليست بهذا السوء حيث تم إصلاح مشكلة الأداء مع الأساليب الافتراضية العامة للإصدار التالي من mono (2.2)، والذي من المقرر أن يتم إصداره في نهاية هذا العام.

[1] الطريقة الافتراضية العامة هي شيء من هذا القبيل:

الواجهة العامة فو {

  void Bla<T> (T a, T b);

}

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