【发布时间】:2014-11-25 16:34:40
【问题描述】:
当我安装一个 .NET 应用程序时,我知道它会受到影响。我的问题是每次运行此应用程序时都会发生这种抖动,还是仅第一次发生?如果它只是第一次发生,我在哪里可以找到这个应用程序的 jit 版本?
【问题讨论】:
-
只安装一次是您的安装人员必须注意的事情。显而易见的谷歌查询是“installer run ngen”。
当我安装一个 .NET 应用程序时,我知道它会受到影响。我的问题是每次运行此应用程序时都会发生这种抖动,还是仅第一次发生?如果它只是第一次发生,我在哪里可以找到这个应用程序的 jit 版本?
【问题讨论】:
根据需要,这些程序集是零散的。您的问题似乎暗示整个应用程序是一次 jit 编译的。这不是发生的事情。在任何特定时刻被jit过的部分都在内存中。
JIT 编译考虑到某些代码可能永远不会 在执行期间被调用。而不是用时间和记忆 将可移植可执行 (PE) 文件中的所有 MSIL 转换为本机 代码,它在执行期间根据需要转换 MSIL 并存储 在内存中生成本机代码,以便它可以访问 在该过程的上下文中的后续调用。加载器创建 并在加载类型时将存根附加到类型中的每个方法 并初始化。当一个方法第一次被调用时,存根 将控制权传递给 JIT 编译器,该编译器为该编译器转换 MSIL 方法转换为本机代码并修改存根以直接指向 生成的本机代码。对 JIT 编译方法的后续调用 因此直接进入本机代码。
它不会改变您问题的答案,而是there are some differences in how the JIT compilation happens with .NET 4.5。在多核处理器上,线程将负责在实际调用方法之前对其进行编译。
【讨论】: