jitCompilationStart MDA

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() { }
        }
    }
}

另請參閱