在分析 C# 应用程序时,我看到一个名为“ThePreStub”的系统(?)方法中有相当大的 CPU 使用率。这是什么?
问问题
3158 次
1 回答
22
NGen 编译代码的吞吐量低于 JIT 编译代码的吞吐量主要有一个原因:交叉汇编引用。在 JIT 编译的代码中,跨汇编引用可以实现为直接调用或跳转,因为这些引用的确切地址在运行时是已知的。然而,对于静态编译的代码,跨程序集引用需要通过一个跳转槽,该跳转槽在运行时通过执行方法 pre-stub 填充正确的地址。除其他外,方法预存根确保该方法引用的程序集的本机映像在该方法执行之前被加载到内存中。pre-stub只需要在方法第一次调用时执行;它被短路以供后续调用。但是,每次调用该方法时,跨程序集引用确实需要经过一个间接级别。与 JIT 编译的代码相比,NGen 编译的代码的吞吐量下降 5-10% 的主要原因是这一点。
于 2013-10-21T15:38:43.387 回答