Partilhar via


jitCompilationStart MDA

Nota

Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

O jitCompilationStart assistente de depuração gerenciado (MDA) é ativado para relatar quando o compilador just-in-time (JIT) começa a compilar uma função.

Sintomas

O tamanho do conjunto de trabalho aumenta para um programa que já está no formato de imagem nativo, porque mscorjit.dll é carregado no processo.

Motivo

Nem todos os assemblies dos quais o programa depende foram gerados em formato nativo ou um assembly não está registrado corretamente.

Resolução

Habilitar esse MDA permite que você identifique qual função está sendo compilada pelo JIT. Certifique-se de que o assembly que contém a função é gerado para o formato nativo e registrado corretamente.

Efeito no tempo de execução

Esse MDA registra uma mensagem pouco antes de um método ser compilado pelo JIT, portanto, habilitar esse MDA tem um impacto significativo no desempenho. Se um método estiver embutido, esse MDA não gerará uma mensagem separada.

Saída

O exemplo de código a seguir mostra a saída de exemplo. Neste caso, a saída mostra que, no assembly Test, o método "m" na classe "ns2.CO" foi compilado por JIT.

method name="Test!ns2.C0::m"

Configuração

O arquivo de configuração a seguir mostra uma variedade de filtros que podem ser empregados para filtrar quais métodos são relatados quando são compilados pela primeira vez em JIT. Você pode especificar que todos os métodos sejam relatados definindo o valor do atributo name como *.

<mdaConfig>
  <assistants>
    <jitCompilationStart>
      <methods>
        <match name="C0::m" />
        <match name="MyMethod" />
        <match name="C2::*" />
        <match name="ns0::*" />
        <match name="ns1.C0::*" />
        <match name="ns2.C0::m" />
        <match name="ns2.C0+N0::m" />
      </methods>
    </jitCompilationStart >
  </assistants>
</mdaConfig>

Exemplo

O exemplo de código a seguir destina-se a ser usado com o arquivo de configuração anterior.

using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

public class Entry
{
    public static void Main(string[] args)
    {
        C0.m();
        C1.MyMethod();
        C2.m();

        ns0.C0.m();
        ns0.C0.N0.m();
        ns0.C1.m();

        ns1.C0.m();
        ns1.C0.N0.m();

        ns2.C0.m();
        ns2.C0.N0.m();
    }
}

public class C0
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void m() { }
}

public class C1
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void MyMethod() { }
}

public class C2
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void m() { }
}

namespace ns0
{
    public class C0
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }

        public class N0
        {
            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void m() { }
        }
    }

    public class C1
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }
    }
}

namespace ns1
{
    public class C0
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }
        public class N0
        {
            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void m() { }
        }
    }
}

namespace ns2
{
    public class C0
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }

        public class N0
        {
            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void m() { }
        }
    }
}

Consulte também