Могу ли я получить краткий фрагмент кода, который требовал бы встраивания 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();
}
}
который я компилирую как "Release" - "Любой процессор" и "Запуск без отладки" из 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();
}
}