我知道Java的 热点 如果 JIT 期望编译的开销低于在解释模式下运行方法的开销,那么 JIT 有时会跳过 JIT 编译方法。.NET 是否 CLR 基于类似启发式的工作?

有帮助吗?

解决方案

笔记:这个答案是基于“每次运行”的上下文。通常,每次运行程序时都会对代码进行 JIT 编译。使用 恩根 或者 .NET 本机 也改变了这个故事......

与 HotSpot 不同,CLR JIT 始终编译 确切地 每次运行一次。它从不解释,也从不根据实际使用情况进行比以前更重的优化重新编译。

当然,这可能会改变,但自 v1 以来就是这样,我预计它不会很快改变。

优点是它使 JIT 变得更加简单 - 无需考虑已在运行的“旧”代码、基于不再有效的前提撤消优化等。

.NET 的优势之一是,大多数 CLR 语言默认将方法设为非虚拟的,这意味着可以完成更多的内联操作。HotSpot 可以内联一个方法,直到它第一次被重写,此时它会撤消优化(或者在某些情况下执行一些巧妙的操作,根据实际类型有条件地仍然使用内联代码)。由于需要担心的虚拟方法较少,.NET 可以在很大程度上忽略无法内联任何虚拟内容的痛苦。

编辑:以上介绍了桌面框架。Compact Framework 在需要时会抛出本机代码,并根据需要再次进行 JIT。然而,这仍然不像 HotSpots 自适应优化。

显然,微框架根本不进行 JIT,而是解释代码。这对于非常受限的设备来说是有意义的。(我不能说我对微框架了解很多。)

其他提示

在.NET运行时始终执行之前编译代码JIT。所以,它永远不会解释。

您可以在 CLR设计选择 <一些更有趣的阅读/ em>的使用安德斯·海尔斯伯格。尤其是部分:

  

我读了微软决定IL总是会被编译,从不解释。如何编码类型信息说明有助于口译更加高效地运行?

     

安德斯·海尔斯伯格:如果一个解释器只是盲目地做了说明,而无需跟踪堆栈的顶部有什么说的,它可以走得更快。当它看到一个IADD,例如,解释不首先要弄清楚哪种添加它是,它知道它是一个整数加法。假设有人已经证实栈看上去是正确的,它的安全,削减了一些时间在那里,你关心的是一位翻译。在我们的例子中,虽然,我们从来没有打算针对与CLR的解释方案。我们打算一直JIT [刚刚在时间编译],并为JIT的目的,我们需要反正跟踪类型的信息。既然我们已经有了类型信息,它实际上并没有买任何东西我们把它的说明。

     

比尔:很多现代JVM [Java虚拟机]做的自适应优化,在那里他们通过解释字节码开始。他们个人资料的应用程序,因为它运行发现,执行80%到90%的时间代码的10%到20%,那么他们编译为本地。他们不一定只是在实时编译的字节码,虽然。的方法的字节码仍然可以由解释器,因为他们正在编译成本,并在后台优化被执行。当本机代码是准备好了,它可以取代的字节码。只要不指定一个解释的情况下,你完全排除这种方法来执行的CLR?

     

安德斯·海尔斯伯格:不,我们并没有完全排除了这种可能性。我们仍然可以解释。我们只是不解释优化。我们不写,将永远只能解释是最高性能的解释进行了优化。我不认为任何人做任何更多。对于10年前的机顶盒,这可能非常有趣。但它不再有趣。 JIT技术已经如此严重,你可以有多种可能的JIT战略点。你甚至可以想像,使用快速JIT,只是撕裂快,然后当我们发现,我们正在执行一个特定方法的时候,使用另一个JIT是花更多的时间和做优化的工作做得更好。有这么多你可以做JIT明智的。

这将是很高兴见到在未来的一段基于跟踪的即时编译器对于低存储器设备。这将主要解释,寻找热点,并转换成那些汇编器和缓存的。我认为这是谷歌确实与他们的Android JIT和微软研究院有一个研究项目持续了跟踪基于JIT。

我发现了一篇文章, SPUR:甲Trace-对于CIL基于JIT编译器 的..也许一些,这将使其进入 CLR1天的?

我不这么认为,我不认为它曾经应该。

如何可以在JIT知道多少次特定的方法将被称为?不会解释因素的频率到决策?

我也怀疑JIT编译器将如何能够分析一个函数来确定解释是否会成为最好的不解释函数本身。而鉴于这一事实(该方法的至少一个通已经发生),岂不是更好只需编译每个方法来减少试图确定哪些方法首先编译开销?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top