.NET で JIT が機能する方法は、メソッドが JIT される前に、メソッド テーブル エントリが、呼び出されたときにメソッドを JIT する小さなスタブを指すことです。その後、JIT コンパイル済みコードの場所を参照するようにメソッド テーブルが更新されます。
呼び出されるメソッドのみが JIT コンパイルされている場合、呼び出されないメソッドの JIT オーバーヘッドはありません。
JIT コンパイラは、必要に応じてメソッド全体をコンパイルします。リリースの場合、ビルド コードは最適化されていない可能性がありますが、それ以外の場合、メソッドは完全にコンパイルされます。
WinDbg/SOS を使用してメソッド テーブルを調べることができます。次の点を考慮してください。
class SomeType
{
public void Called()
{
Console.WriteLine("called");
}
public void NotCalled()
{
Console.WriteLine("not called");
}
}
のインスタンスを作成し、 をSomeType
呼び出しCalled
、メソッド テーブルで を調べるとしますSomeType
。x86 では、次のように表示されます。
0:000> !dumpmt -md 00a7381c
EEClass: 00a712d0
Module: 00a72e94
Name: ConsoleApplication1.SomeType
mdToken: 02000002
File: c:\temp\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
BaseSize: 0xc
ComponentSize: 0x0
Slots in VTable: 7
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
Entry MethodDe JIT Name
72ca4960 729a6728 PreJIT System.Object.ToString()
72c98790 729a6730 PreJIT System.Object.Equals(System.Object)
72c98360 729a6750 PreJIT System.Object.GetHashCode()
72c916f0 729a6764 PreJIT System.Object.Finalize()
00df00d8 00a73814 JIT ConsoleApplication1.SomeType..ctor()
00df0110 00a737fc JIT ConsoleApplication1.SomeType.Called()
00a7c031 00a73808 NONE ConsoleApplication1.SomeType.NotCalled()
はJITCalled
コンパイルされていますが、まだ呼び出していないNotCalled
ため、JIT コンパイルされていません。
また、 のメソッドobject
はすべて PreJIT コンパイルされていることに注意してください。
リリース ビルドでは、短いメソッドがインライン化される可能性があることに注意してください。その場合、メソッドとして呼び出されるのではなく、呼び出しサイト用に生成されたコードの一部として単に含まれます。