Note
本文專指 .NET 框架。 此規定不適用於較新的 .NET 實作,包括 .NET 6 及更新版本。
jitCompilationStart管理除錯助理(MDA)會被啟動,當即時編譯器(JIT)開始編譯函式時會被啟動以回報。
Symptoms
對於已經是原生影像格式的程式,工作集大小會增加,因為 mscorjit.dll 會被載入進程中。
原因
程式所依賴的所有組合語言並非都已生成原生格式,或是組合語言未正確註冊。
解決方法
啟用此 MDA 後,您可以辨識正在進行 JIT 編譯的函式。 確保包含函式的組合語言是原生格式產生並正確註冊的。
對運行時間的影響
此 MDA 會在方法被 JIT 編譯前記錄訊息,因此啟用此 MDA 對效能有顯著影響。 若方法為內聯,此 MDA 不會產生獨立訊息。
Output
以下程式碼範例展示了範例輸出。 在此情況下,輸出顯示在組合測試中,類別「ns2.CO」的方法「m」是 JIT 編譯的。
method name="Test!ns2.C0::m"
Configuration
以下設定檔展示了多種過濾器,可用來篩選首次 JIT 編譯時報告的方法。 你可以透過將名稱屬性的值設為 *,來指定所有方法都要回報。
<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() { }
}
}
}