Posso avere uno snippet di codice conciso che avrebbe incorporato JIT in linea per favore?

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

  •  12-12-2019
  •  | 
  •  

Domanda

Sto cercando di produrre un po 'di snippet di codice "Hello World" di dimensioni "Hello World" che avrebbe incorato JIT in linea.Finora ho questo:

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

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

che compilo come "rilascio" - "qualsiasi CPU" e "correre senza debug" da Visual Studio.Visualizza il nome del mio assemblaggio del programma di esempio in modo che GetAssembly() chiaramente non sia collegato in Main(), altrimenti visualizzerebbe il nome del gruppo mscorlib.

Come posso comporre qualche snippet di codice C # che avrebbe incorrere in JIT inlinearsi?

È stato utile?

Soluzione

Certo, ecco un esempio:

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

Compilare in una modalità di rilascio:

csc /o+ /debug- Test.cs
.

Run:

c:\Users\Jon\Test>test

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

Nota la traccia dello stack - sembra come se Throw sia stato chiamato direttamente da Main, poiché il codice per CallThrow è stato inlineto.

Altri suggerimenti

La tua comprensione dell'enquandario sembra errata: se GetAssembly è stato innato, mostrerebbe comunque il nome del tuo programma.

Inline significa: "Utilizzare il corpo della funzione nel luogo della chiamata della funzione".Inlineing GetAssembly porterebbe al codice equivalente a questo:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly()
                                                    .FullName);
        Console.ReadLine();
    }
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top