我已经阅读并听到了很多关于 JIT 编译器如何进行原生代码编译器无法实现的优化以及这些优化可以带来巨大的性能提升的信息。
所以我想知道,有哪些最重要的优化是 .NET Framework 或 JVM 所做的,而原生编译器却无法做到?此外,这些如何提供巨大的性能提升?
我不知道我是否正确地表达了这个问题,我想我可能在评论中有很多解释要做
最佳答案
我可以举一个优化的例子。假设你在某处有一个函数。 (将其视为类似 C 的伪代码。)
void function(MyClass x)
{
x.doSomething();
for (obj in x.getWidgets())
obj.doSomethingElse();
}
这是适当的模糊。但是,假设您的整个图像中只有一个具体类继承自
MyClass
。 : MyConcreteClass
.在这种情况下,JIT 可以内联 doSomething
和 getWidgets
.如果它知道 getWidgets
返回的类型,那么也许它可以内联doSomethingElse
也是。假设这里
MyClass
不是最终/密封类,提前编译器无法内联其方法(它不知道要内联哪些函数);就编译器所知,MyClass
有一百种不同的实现。 .但是,JIT 可以针对图像的当前状态进行优化。它可以在每次调用
function
开始时安装检查。确保 x
是 MyConcreteClass
,然后运行内联版本。如果你动态加载一个带有另一个继承自 MyClass
的具体类的模块,则检查将失败,JIT 会将函数重新编译为通用的。这些是唯一的种类 JIT 编译器可用但提前编译器不可用的优化:利用有关程序动态状态的信息并相应地重新编译程序的优化。
请注意,一些提前编译器能够执行通常归因于 JIT 编译器的技巧。例如,过程间优化(或全局优化)和配置文件驱动优化。 GCC 和 Clang 可以同时使用这两种技巧,但大多数人不使用它们,因为打开它们需要额外的(人工)工作。 JIT 编译器可以在不打扰最终用户的情况下启用这些选项。
巨大的性能提升:我还没有听说过 JIT 编译器有任何巨大的性能提升。 C 和 C++ 程序在没有 JIT 的情况下仍然很快。许多人仍然更喜欢 Fortran 进行数值工作(有充分的理由)。
脚注:我不确定你的术语。大多数 JIT 不也是 native 代码编译器吗?除了 JIT 之外的其他类型的编译器我会称之为“提前”或 AOT,或者可能是“静态”。 (然后“编译”和“解释”之间的界限非常模糊。)
关于.net - 最佳 JIT 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10135900/