请问.NET CLR JIT编译每一个方法,每一次?(Does the .NET CLR JIT c

2019-06-18 06:57发布

我知道Java的热点 JIT有时也会跳过JIT编译的方法,如果它希望编译的开销比运行在解释模式的方法的开销较低。 请问.NET CLR基于类似的启发式工作?

Answer 1:

注意:这个答案是“每运行”上下文。 该代码会在每次运行程序时,通常即时编译。 使用NGEN或.NET本机改变了故事,太...

不像热点时,CLR JIT总是每次运行编译一次 。 它从不解释,而且也从未与较重的优化比重新编译根据实际使用之前。

这可能会改变,当然,但它一直以来V1这样,我不指望它很快改变。

其优点是,它使JIT很多简单 - 没有必要考虑“老”的代码已经在运行,撤消基于处所是等不再有效的优化

在.NET的青睐的一点是,大多数CLR语言使方法为非虚默认情况下,这意味着更多的内联可以做。 热点可以内联的方法,直到它的超控,此时将其撤销的优化(或做一些聪明的东西,在某些情况下,有条件地仍然使用内嵌代码,根据实际类型)。 用更少的虚拟方法担心,.NET可以在很大程度上忽略不能够内嵌任何虚拟的痛苦。

编辑:以上介绍的桌面框架。 Compact Framework中抛出本地代码当它要根据需要再次JITting。 然而,这还不是像热点自适应优化。

微框架不JIT都显然,解释代码,而不是。 这使得非常有限的设备感。 (我不能说我很了解微架构。)



Answer 2:

.NET运行时始终执行之前编译代码JIT。 所以,这是从来没有解释。

你可以找到一些更有趣的阅读CLR设计选择与安德斯·海尔斯伯格 。 特别是部分:

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

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

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

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



Answer 3:

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

我发现了一篇文章, SPUR:为CIL的追踪基于JIT编译器 ..也许一些,这将使其进入CLR在一起?



Answer 4:

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

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

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



文章来源: Does the .NET CLR JIT compile every method, every time?
标签: .net clr jit