هل يمكنني الحصول على مقتطف رمز موجز من شأنه أن يؤدي إلى تضمين JIT من فضلك؟

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

  •  12-12-2019
  •  | 
  •  

سؤال

أحاول إنتاج بعض مقتطفات الكود C# بحجم "Hello World" والتي قد تؤدي إلى تضمين JIT.حتى الآن لدي هذا:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine( GetAssembly().FullName );
        Console.ReadLine();
    }

    static Assembly GetAssembly()
    {
        return System.Reflection.Assembly.GetCallingAssembly();
    }
}

الذي أقوم بتجميعه كـ "إصدار" - "أي وحدة معالجة مركزية" و"تشغيل بدون تصحيح الأخطاء" من Visual Studio.يعرض اسم نموذج تجميع البرنامج الخاص بي بشكل واضح GetAssembly() لم يتم تضمينه في Main(), ، وإلا فسيتم عرضه mscorlib اسم التجمع.

كيف يمكنني إنشاء بعض مقتطفات التعليمات البرمجية لـ C# التي قد تؤدي إلى تضمين JIT؟

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

المحلول

بالتأكيد، إليك مثال:

using System;

class Test
{
    static void Main()
    {
        CallThrow();
    }

    static void CallThrow()
    {
        Throw();
    }

    static void Throw()
    {
        // Add a condition to try to disuade the JIT
        // compiler from inlining *this* method. Could
        // do this with attributes...
        if (DateTime.Today.Year > 1000)
        {
            throw new Exception();
        }
    }
}

تجميع في وضع يشبه الإصدار:

csc /o+ /debug- Test.cs

يجري:

c:\Users\Jon\Test>test

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
   at Test.Throw()
   at Test.Main()

لاحظ تتبع المكدس - يبدو كما لو كان Throw تم استدعاؤه مباشرة من قبل Main, لأن الكود الخاص بـ CallThrow كان مضمنا.

نصائح أخرى

يبدو أن فهمك للتضمين غير صحيح:لو GetAssembly تم تضمينه، فسيظل يظهر اسم البرنامج الخاص بك.

يعني التضمين:"استخدم نص الوظيفة في مكان استدعاء الوظيفة".التبطين GetAssembly سيؤدي إلى رمز يعادل هذا:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly()
                                                    .FullName);
        Console.ReadLine();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top