JIT优化最佳

时间:2012-04-13 05:51:35

标签: .net performance compiler-construction jvm jit

我已经阅读并听到很多关于JIT编译器如何进行本机代码编译器无法实现的优化,以及这些优化可以带来巨大的性能提升。

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

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

2 个答案:

答案 0 :(得分:4)

我可举一个优化的例子。假设你在某个地方有一个功能。 (将其视为类似C的伪代码。)

void function(MyClass x)
{
    x.doSomething();
    for (obj in x.getWidgets())
        obj.doSomethingElse();
}

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

假设MyClass不是最终/密封类,提前编译器不能内联其方法(它不知道要内联的函数);对于所有编译器都知道,MyClass有一百种不同的实现。

但是,JIT可以针对图像的当前状态进行优化。它可以在每次调用function时开始检查,以确保xMyConcreteClass,然后运行内联版本。如果使用继承自MyClass的另一个具体类动态加载模块,则检查将失败,JIT将重新编译该函数为通用。

这些是JIT编译器可用的唯一优化类型,这些优化对于提前编译器是不可用的:利用有关程序动态状态的信息的优化并重新编译相应的计划。

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

巨大的性能提升我还没有听说过JIT编译器的性能提升。没有JIT,C和C ++程序仍然很快。许多人仍然喜欢Fortran进行数值工作(有充分的理由)。

脚注:我不确定您的术语。大多数JIT都不是本机代码编译器吗?除JIT之外的其他类型的编译器我会称之为“提前”或AOT,或者可能是“静态”。 (然后在“编译”和“解释”之间存在令人难以置信的模糊界限。)

答案 1 :(得分:1)

Javascript是一个更好的例子,因为它不像JVM或CLR那样对编译器友好。

JIT编译器可以为Javascript类生成具体的专用表示,这对于静态编译器来说很难,因为在程序执行期间可以在任何时候修改类。您还可以根据实际类型推测性地内联被调用的函数(Dietrich Epp已在他的答案中解释过)。

http://code.google.com/p/v8/的视频很好地解释了这些优化。