JIT compiler and its benefits for speed up the execution of programs in .net in front of c++
如我们所知,.net有cli和jit来执行程序。但是,这两个阶段可能会导致较低的速度和性能相比,C++编译所有代码在一个阶段。我想知道.NET的语言如何克服这个缺点并处理它?
在C++编译器上工作过,过去几年都在.NET JIT上工作,我认为有几件事情值得考虑:
- 正如许多其他人所指出的,JIT正在与您的应用程序一起运行,它试图仔细地平衡快速的JIT时间与JIT代码的质量。在C++中看到的更精细的优化通常带有非常高的编译时间价格标签,并且在编译时间和代码质量图之间有一些非常锐利的膝盖。
- 当JIT提前运行时,预抖动似乎可以稍微改变这个方程,可能需要更多的时间,但预抖动扩大优化范围的能力非常有限(例如,我们尝试避免引入脆弱的跨程序集依赖项,因此,例如不会跨程序集边界内联)。因此,预同步代码的运行速度比同步代码慢一些,并且主要有助于应用程序的启动时间。
- .NET的默认执行模型排除了许多过程间优化,因为动态类加载、反射以及探查器在运行过程中更新方法体的能力。总的来说,我们认为,从这些功能中获得的生产力和应用程序架构是值得的。但是对于不需要这些功能的情况,我们正在寻找方法来确保如果你的应用不需要它,你的应用就不会为此付费。
- 例如,我们在corert中进行了一些"纯粹"的AOT工作,但结果反射是有限的。
- .NET Core 2.1包含了一个分层抖动的预览,它允许我们减轻对抖动时间的一些限制——我们将能够投资更多的时间抖动方法,我们知道这些方法经常被执行。因此,我希望看到随着时间的推移,更多复杂的优化被添加到JIT中。
- .NET核心2.1还包括硬件内部函数的预览,因此您可以充分利用现代硬件上提供的丰富指令集。
- .NET的JIT还没有从配置文件反馈中获得多少好处。这是我们正在积极致力于改变的事情,虽然这需要时间,而且很可能与分层有关。
- NET执行模型从根本上改变了人们考虑某些编译器优化的方式。例如,从编译器的角度来看,许多操作(包括字段访问之类的低级事物)可以引起语义上有意义的异常(在C++中,只有调用/抛出会导致异常)。而且.NET的GC是精确的和重新定位的,这在其他方面对优化施加了限制。