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

который я компилирую как "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();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top