Posso ter uma breve trecho de código que seria incorrer JIT inlining, por favor?
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?
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();
}
}