【问题标题】:Documenting CLR JIT Strategy记录 CLR JIT 策略
【发布时间】:2013-02-12 20:40:03
【问题描述】:

我想知道 CLR 适用于 JIT 编译的范围和顺序。

例如,如果我的应用程序只调用给定类的单个方法,那么该类的未使用方法是否会不必要地进行 JIT 编译?如果是,它们都是在执行我需要的一种方法之前编译的,还是在事后延迟编译?

那么方法中的分支呢? CLR 是否允许编译方法中的一半代码,同时允许同一方法中的单独分支在需要时保持未编译状态?

随着时间的推移,我似乎发现了一些文章,这些文章提供了其中一些细节的一瞥,但现在我没有找到任何东西可以提供关于 CLR 如何以及何时选择 JIT代码。有推荐的书籍或链接吗?

最好有任何此类指南按 .net 版本分解此类 JIT 决策逻辑。

【问题讨论】:

    标签: .net clr jit


    【解决方案1】:

    JIT 在 .NET 中的工作方式是,在方法被 jitted 之前,方法表条目指向一个小存根,该存根将在调用时 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()
    

    注意Called 是JIT 编译的,但由于我们还没有调用NotCalled,它还没有被JIT 编译。

    另外,请注意object 中的方法都已经过 PreJIT 编译。

    请记住,在发布构建中,短方法​​可能会被内联,在这种情况下,它们不会作为方法调用,而只是作为调用站点生成的代码的一部分包含在内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-06
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多