Optimization JIT编译器可以做哪些AOT编译器不能做的事情?
即时(JIT)编译器可以基于对提前(AOT)编译器不可用的运行时信息优化程序 此运行时信息的最明显示例是目标平台,例如,运行程序的确切CPU,或任何可用的加速器,如GPU。这就是OpenCL JIT编译的意义 但是,假设我们提前知道目标平台是什么:我们知道哪些SIMD扩展将可用,等等。JIT编译器可以利用哪些AOT编译器无法利用的其他运行时信息 热点风格的JIT编译器将自动优化程序的热点。。。但是AOT编译器不能只优化整个程序、热点和所有方面吗Optimization JIT编译器可以做哪些AOT编译器不能做的事情?,optimization,compiler-construction,compiler-optimization,jit,Optimization,Compiler Construction,Compiler Optimization,Jit,即时(JIT)编译器可以基于对提前(AOT)编译器不可用的运行时信息优化程序 此运行时信息的最明显示例是目标平台,例如,运行程序的确切CPU,或任何可用的加速器,如GPU。这就是OpenCL JIT编译的意义 但是,假设我们提前知道目标平台是什么:我们知道哪些SIMD扩展将可用,等等。JIT编译器可以利用哪些AOT编译器无法利用的其他运行时信息 热点风格的JIT编译器将自动优化程序的热点。。。但是AOT编译器不能只优化整个程序、热点和所有方面吗 我想要一些JIT编译器可以执行AOT编译器无法执行
我想要一些JIT编译器可以执行AOT编译器无法执行的特定优化的示例。如果您能提供任何证据证明这种优化在“真实世界”场景中的有效性,您将获得额外的好处。一个优点是JIT编译器可以连续分析代码并优化输出,例如对齐/取消对齐某些代码块、取消优化某些函数、重新排序分支以减少预测失误 当然,AoT编译器也可以进行概要文件引导的优化,但是它们在开发人员和测试人员执行的测试用例中受到限制,这可能无法反映实际输入的动态特性 例如,Android在Kitkat中引入了ART,而在Nougat和更高版本中采用了混合方法。在Nougat和更高版本中,应用程序的某些部分提前编译,优化程度较低,然后在运行配置文件后,在手机充电时,将使用配置文件结果再次优化应用程序 Android 7.0 Nougat向ART引入了带有代码分析的JIT编译器,使其能够在Android应用程序运行时不断提高性能。JIT编译器补充了ART当前的超前编译器,并有助于提高运行时性能。[9] 一些相关问题:
换言之;实际上,“AOT与JIT”是实现的比较,而不是“AOT与JIT”本身的真正比较;在实践中,由于实现细节的原因,AOT的性能很差,而JIT的性能明显比差,因为JIT本身很差(昂贵的优化根本不可行,因为它们是在运行时进行的);JIT看起来“几乎一样好”的唯一原因是它“几乎一样坏”。JIT可以基于运行时信息进行优化,这会导致在编译时无法证明的更严格的边界条件。示例:
- 它可以看到内存位置没有别名(因为所采用的代码路径从未对其进行别名化),因此将变量保留在寄存器中李>
- 它可以消除永远不会发生的条件下的测试(例如,基于参数的当前值)李>
- 它可以访问完整的程序,并可以在它认为合适的地方内联代码李>
- 它可以在运行时根据特定的使用模式执行分支预测,从而达到最佳效果
此外,静态编译的链接时和运行时数据优化都需要在构建过程中付出巨大的努力(在我一生中工作过的10多个地方,我还没有看到它们在生产中得到应用);使用JIT时,默认情况下它们处于启用状态 你读过吗:@AnubhavSrivastava谢谢你的链接。这是一个类似的问题,但无论是评分最高的答案还是公认的答案都没有真正回答我的问题。不过,在其他答案中有几个仅JIT优化的例子:跨库优化和使用跟踪树的动态内联。我很想知道它们在实践中有多大的不同。反射是一个臭名昭著的问题,不能静态地确定需要哪种类型