¿Puedo tener un fragmento de código conciso que incurra en la inserción JIT, por favor?
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?
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();
}
}