¿Puedo tener un fragmento de código conciso que incurra en la inserción JIT, por favor?

StackOverflow https://stackoverflow.com//questions/12686850

  •  12-12-2019
  •  | 
  •  

Pregunta

Estoy intentando producir un fragmento de código C# del tamaño "Hola mundo" que incurriría en una inserción JIT.Hasta ahora tengo esto:

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

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

que compilo como "Versión" - "Cualquier CPU" y "Ejecutar sin depurar" desde Visual Studio.Muestra el nombre del ensamblado de mi programa de muestra con tanta claridad. GetAssembly() no está integrado en Main(), de lo contrario se mostraría mscorlib nombre del ensamblaje.

¿Cómo compongo un fragmento de código C# que generaría una inserción JIT?

¿Fue útil?

Solución

Claro, aquí tienes un ejemplo:

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

Compile en modo similar a un lanzamiento:

csc /o+ /debug- Test.cs

Correr:

c:\Users\Jon\Test>test

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

Tenga en cuenta el seguimiento de la pila: parece como si Throw fue llamado directamente por Main, porque el código para CallThrow estaba en línea.

Otros consejos

Su comprensión de la inserción parece incorrecta:Si GetAssembly estuviera en línea, aún mostraría el nombre de su programa.

En línea significa:"Utilice el cuerpo de la función en el lugar de la llamada a la función".en línea GetAssembly conduciría a un código equivalente a este:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly()
                                                    .FullName);
        Console.ReadLine();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top