Pergunta

Eu estou tentando produzir alguns "Olá Mundo" tamanho C# fragmento de código que seria incorrer JIT inlining.Até agora eu tenho isso:

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

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

o que eu compilar como "Lançamento"-"Any CPU" e "Executar sem depuração" do Visual Studio.Ele exibe o nome do meu programa de exemplo de montagem de forma tão clara GetAssembly() não é embutidos em Main(), caso contrário, ele iria mostrar mscorlib nome do assembly.

Como faço para compor algumas C# fragmento de código que seria incorrer JIT inlining?

Foi útil?

Solução

Certo, aqui está um exemplo:

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();
        }
    }
}

Compilar em uma versão de como modo:

csc /o+ /debug- Test.cs

Executar:

c:\Users\Jon\Test>test

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

Observação o rastreamento de pilha - parece como se Throw foi chamado diretamente pelo Main, porque o código para CallThrow foi embutidos.

Outras dicas

Sua compreensão de inlining parece incorreta:Se GetAssembly foi antes, seria ainda mostrar o nome do seu programa.

Inlining significa:"Usar o corpo da função, no lugar da chamada de função".Inlining GetAssembly levaria para o código equivalente a esta:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly()
                                                    .FullName);
        Console.ReadLine();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top