هل يمكنني الحصول على مقتطف رمز موجز من شأنه أن يؤدي إلى تضمين JIT من فضلك؟
سؤال
أحاول إنتاج بعض مقتطفات الكود 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();
}
}