يمكنني معرفة ما إذا كان المحول البرمجي C# inlined طريقة الاتصال ؟

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

سؤال

انا اكتب XNA لعبة حيث كنت تفعل كل بكسل من الاصطدام الشيكات.حلقة والذي يتحقق هذا يفعل ذلك عن طريق تحويل int و المعامل ORing و عموما من الصعب قراءة وفهم.

أود أن أضيف طرق خاصة مثل private bool IsTransparent(int pixelColorValue) لجعل حلقة أكثر قابلية للقراءة, ولكن أنا لا أريد النفقات العامة من استدعاءات الأسلوب لأن هذا هو الأداء رمز الحساسة.

هل هناك طريقة لإجبار مترجم مضمنة هذه الدعوة أو سأفعل أنا فقط أتمنى أن المجمع لن تفعل هذا الأمثل ؟

إذا لم يكن هناك وسيلة لإجبار هذا, هل هناك طريقة للتحقق مما إذا كانت طريقة المضمنة قصيرة من قراءة التفكيك?سوف الأسلوب تظهر في التفكير إذا كان inlined لا المتصلين موجودة ؟

تحرير: لا أستطيع إجبار عليه ، حتى يمكن اكتشاف ذلك ؟

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

المحلول

لا يمكنك.أكثر من يقرر على inlining ليس مقابل المترجم أن يأخذ لك رمز وتحولها إلى IL, ولكن JIT compiler أن يأخذ IL وتحولها إلى رمز الجهاز.هذا هو فقط لأن برنامج التحويل البرمجي JIT يعرف ما يكفي عن بنية المعالج أن يقرر إذا وضع طريقة مضمنة المناسب كما انها المقايضة بين التعليمات pipelining و حجم ذاكرة التخزين المؤقت.

حتى تبحث في .صافي عاكس لن تساعدك.

نصائح أخرى

"يمكنك التحقق من النظام.انعكاس.MethodBase.GetCurrentMethod().الاسم.إذا كان الأسلوب هو inlined ، وسوف عودة اسم المتصل بدلا من ذلك."

--جويل Coehoorn

هناك طريقة جديدة لتشجيع أكثر عدوانية inlining في .net 4.5 الموضح هنا: http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/20/aggressive-inlining-in-the-clr-4-5-jit.aspx

الأساس هو مجرد العلم أن نخبر المترجم أن مضمنة إذا كان ذلك ممكنا.للأسف, انها ليست متوفرة في النسخة الحالية من XNA (Game Studio 4.0) ولكن يجب أن تكون متوفرة عند XNA أدرك VS 2012 هذا العام بعض الوقت.هو بالفعل المتاحة إذا كنت بطريقة أو بأخرى تعمل على أحادية.

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
public static int LargeMethod(int i, int j)
{ 
    if (i + 14 > j) 
    { 
        return i + j; 
    } 
    else if (j * 12 < i) 
    { 
        return 42 + i - j * 7; 
    } 
    else 
    { 
        return i % 14 - j; 
    } 
}

تكون على علم أن أجهزة إكس بوكس يعمل مختلفة.

جوجل تحول هذا:

"مضمنة الأسلوب الذي يخفف من النفقات العامة مكالمة من طريقة.JIT إلى أشكال مضمنة ما يحقق الشروط التالية.

  • IL رمز حجم 16 بايت أو أقل.
  • فرع الأمر غير المستخدمة (إذا الجملة الخ).
  • المتغير المحلي غير المستخدمة.
  • معالجة الاستثناء لم نفذت (محاولة الصيد ، إلخ.).
  • تعويم لا تستخدم حجة أو قيمة الإرجاع من طريقة (ربما من قبل أجهزة إكس بوكس 360 ، لا تطبق).
  • عندما اثنين أو أكثر من الحجج في أسلوب يستخدم من أجل تحويل أعلنت.

ومع ذلك ، دالة ظاهري لا تشكل في مجموعة مضمنة."

http://xnafever.blogspot.com/2008/07/inline-method-by-xna-on-xbox360.html

ليس لدي فكرة إذا كان هو الصحيح.أي شخص ؟

لا, لا يمكنك.

في الأساس, لا يمكنك أن تفعل ذلك في معظم الحديث C++ compilers سواء. inline هو مجرد عرض مترجم.انها حرة في ذلك أم لا.

C# compiler لا تفعل أي الخاصة بالتضمين في IL المستوى.جيت محسن هو واحد من شأنها أن تفعل ذلك.

لماذا لا تستخدم تعليمات برمجية غير آمنة (مضمنة ج كما معروف) و الاستفادة من c/c++ على غرار مؤشرات هذا هو في مأمن من GC (أي لا تتأثر جمع) ولكن تأتي مع الآثار الأمنية (غير قادر على استخدام الإنترنت في المنطقة تطبيقات) لكن ممتاز لهذا النوع من الشيء يبدو أنك تحاول تحقيق خاصة مع الأداء وحتى أكثر من ذلك مع المصفوفات و المعامل العمليات ؟

لتلخيص, تريد أداء جزء صغير من التطبيق الخاص بك ؟ استخدام تعليمات برمجية غير آمنة واستخدام مؤشرات الخ يبدو الخيار الأفضل بالنسبة لي

تحرير:قليلا من كاتب ?http://msdn.microsoft.com/en-us/library/aa288474(مقابل.71).aspx

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

يمكنك الكشف عن ذلك في وقت التشغيل المذكورة أعلاه GetCurrentMethod الاتصال.ولكن هذا قد يبدو قليلا من النفايات[1].أسهل شيء للقيام به مجرد ILDASM MSIL و تحقق هناك.

لاحظ أن هذا هو على وجه التحديد مترجم مصدر المكالمة ، يتم تغطيتها في مختلف انعكاس مستندات على MSDN.

إذا كان الأسلوب الذي يستدعي GetCallingAssembly طريقة توسيع مضمنة من قبل المترجم (هذا إن إدراج المحول وظيفة الجسم في المنبعثة Microsoft intermediate language (MSIL) بدلا من انبعاث استدعاء دالة) ، ثم عادت الجمعية العامة من قبل GetCallingAssembly الطريقة هي الجمعية التي تحتوي على مضمنة رمز.هذه قد تكون مختلفة من التجميع الذي يحتوي على الأسلوب الأصلي.لضمان أن الأسلوب الذي يدعو GetCallingAssembly الطريقة ليست inlined من قبل المترجم ، يمكنك تطبيق MethodImplAttribute السمة مع MethodImplOptions.NoInlining.

ومع ذلك ، فإن غضب هو أيضا حر في أن مضمنة المكالمات - ولكن أعتقد أن المجمع سيكون السبيل الوحيد للتحقق من ما هو و لم ينتهي عند هذا المستوى.

تحرير:فقط لتوضيح بعض اللبس في هذا الموضوع ، csc.exe سوف مضمنة MSIL المكالمات - على الرغم من غضب سوف (ربما) تكون أكثر عدوانية في ذلك.

[1] و من النفايات - أعني أن (أ) أنه من الهزائم الغرض من inlining (أفضل أداء) بسبب انعكاس البحث.و (ب) ، فإنه من المحتمل تغيير inlining السلوك بحيث انها لم تعد inlined على أي حال.وقبل أن تعتقد أنك يمكن أن تتحول فقط على تصحيح يبني مع تأكيد أو شيء - أن يدرك أنه لن يكون inlined أثناء التصحيح, ولكن قد يكون في الافراج عنهم.

هل هناك طريقة لإجبار مترجم مضمنة هذه الدعوة أو سأفعل أنا فقط أتمنى أن المجمع لن تفعل هذا الأمثل ؟

إذا كان أرخص مضمنة وظيفة ، وسوف.لذلك لا تقلق بشأن ذلك إلا إذا كان التعريف يقول أنه هو في الواقع مشكلة.

للحصول على مزيد من المعلومات

جيت التحسينات في .NET FRAMEWORK 3.5 SP1

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