JIT优化最佳

App*_*ker 8 .net compiler-construction performance jit jvm

我已阅读并听到了很多有关的JIT编译器如何能作出这样的本地代码编译器是不可能的优化,这些优化可以给巨大的性能提升.

所以我想知道,什么是,比方说,.NET Framework或JVM做本地编译器不能做的最重要的优化?另外,这些如何带来巨大的性能提升?

我不知道我是否正确地表达了这个问题,猜测我可能会在评论中做很多解释

Die*_*Epp 4

我可以举一个优化的例子。假设你在某处有一个函数。(将此视为类似 C 的伪代码。)

void function(MyClass x)
{
    x.doSomething();
    for (obj in x.getWidgets())
        obj.doSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

这是相当模糊的。但是,假设您的整个映像中只有一个继承自 : 的具体MyClassMyConcreteClass。在这种情况下,JIT 可以内联doSomethinggetWidgets。如果它知道从 返回的类型getWidgets,那么也许它doSomethingElse也可以内联。

假设这里MyClass不是一个最终/密封类,提前编译器无法内联其方法(它不知道要内联哪些函数);据编译器所知,有一百种不同的MyClass.

然而,JIT 可以针对图像的当前状态进行优化。 它可以在每次调用的开头安装一个检查,以function确保这x是一个MyConcreteClass,然后运行内联版本。如果您动态加载具有继承自 的另一个具体类的模块MyClass,则检查将失败,并且 JIT 会将函数重新编译为通用函数。

这些是JIT 编译器可用但提前编译器无法使用的唯一优化类型:利用有关程序动态状态的信息并相应地重新编译程序的优化。

请注意,一些提前编译器能够执行通常归因于 JIT 编译器的技巧。例如,过程间优化(或全局优化)和配置文件驱动的优化。GCC 和 Clang 可以使用这两种技巧,但大多数人都会放弃它们,因为需要额外的(人类)工作才能打开它们。JIT 编译器可以启用这些选项,而不会打扰最终用户。

巨大的性能提升:我还没有听说过 JIT 编译器有任何巨大的性能提升。C 和 C++ 程序在没有 JIT 的情况下仍然很快。许多人仍然更喜欢使用 Fortran 来进行数值计算(有充分的理由)。

脚注:我不确定你的术语。大多数 JIT 不也是本机代码编译器吗?除了 JIT 之外的其他类型的编译器我会称之为“提前”或 AOT,或者可能是“静态”。(然后“编译”和“解释”之间的界限非常模糊。)