3

CLR が JIT コンパイルに適用されるスコープとシーケンスを知りたいです。

たとえば、アプリケーションが特定のクラスの 1 つのメソッドのみを呼び出す場合、そのクラスの未使用のメソッドは不必要に JIT コンパイルされますか? はいの場合、それらはすべて必要なメソッドを実行する前に JIT コンパイルされていますか、それとも事後に遅延コンパイルされていますか?

メソッド内の分岐についてはどうでしょうか。CLR では、メソッド内のコードの半分をコンパイルできる一方で、同じメソッド内の別の分岐を必要になるまでコンパイルしないままにすることができますか?

時間が経つにつれて、これらの詳細の一部を垣間見ることができる記事を見つけたようですが、現時点では、CLR がコードのセクションを JIT する方法とタイミングの統合された読みやすい要約を提供するものは見つかりません。おすすめの本やリンクはありますか?

そのようなガイドが、そのような JIT 決定ロジックを .net バージョンごとに分類するのが最善です。

4

1 に答える 1

6

.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 コンパイルされていることに注意してください。

リリース ビルドでは、短いメソッドがインライン化される可能性があることに注意してください。その場合、メソッドとして呼び出されるのではなく、呼び出しサイト用に生成されたコードの一部として単に含まれます。

于 2013-02-12T20:43:01.393 に答える