注释
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
当实时 (JIT) 编译器开始编译函数时,将 jitCompilationStart 激活托管调试助手 (MDA) 来报告。
症状
已采用本机图像格式的程序的工作集大小会增加,因为 mscorjit.dll 加载到进程中。
原因
并非所有程序依赖的程序集都已生成为本机格式,或者程序集未正确注册。
解决方案
启用此 MDA 可以识别正在编译 JIT 的函数。 确保包含函数的程序集生成为本机格式并正确注册。
对运行时的影响
此 MDA 在方法编译 JIT 之前记录消息,因此启用此 MDA 会对性能产生重大影响。 如果方法是内联方法,则此 MDA 不会生成单独的消息。
输出
下面的代码示例演示示例输出。 在这种情况下,输出显示,在程序集测试中,类“ns2.CO”上的方法“m”已编译为 JIT 编译。
method name="Test!ns2.C0::m"
配置
以下配置文件显示了各种筛选器,这些筛选器可用于筛选出首次编译 JIT 时报告的方法。 可以通过将 name 属性的值设置为 *来指定报告所有方法。
<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>
Example
下面的代码示例旨在与前面的配置文件一起使用。
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() { }
}
}
}