首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即时编译与堆栈替换的区别

即时编译与堆栈替换的区别
EN

Stack Overflow用户
提问于 2012-02-02 08:29:40
回答 2查看 10K关注 0票数 51

它们做的几乎都是一样的事情。确定该方法是热的,然后编译它,而不是解释。使用OSR,您只需在编译后立即转移到编译版本,这与JIT不同,在JIT中,编译后的代码在第二次调用方法时被调用。

除此之外,还有其他的区别吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-02 09:20:21

一般来说,即时编译指的是在运行时编译本机代码并执行它,而不是(或除了)解释。有些V8甚至没有解释器;它们会即时编译执行的每个函数(具有不同程度的优化),比如谷歌V8。

On Stack Replacement (OSR)是一种在同一功能的不同实现之间进行切换的技术。例如,您可以使用OSR在编译完成后立即从解释的或未优化的代码切换到JITed代码。

当您在函数运行时将其标识为“热”时,OSR非常有用。这可能不一定是因为函数被频繁调用;它可能只被调用一次,但它在一个大循环中花费了大量时间,这可能会从优化中受益。当发生OSR时,VM暂停,目标函数的堆栈框架被替换为可能在不同位置具有变量的等效框架。

OSR也可以在另一个方向上发生:从优化代码到未优化代码或解释代码。优化的代码可能会根据过去的行为对程序的运行时行为做出一些假设。例如,如果您只看到过一种类型的接收器对象,则可以将虚拟或动态方法调用转换为静态调用。如果后来证明这些假设是错误的,则可以使用OSR来退回到更保守的实现:将优化的堆栈框架转换为未优化的堆栈框架。如果VM支持内联,您甚至可能最终将一个优化的堆栈帧转换为几个未优化的堆栈帧。

票数 74
EN

Stack Overflow用户

发布于 2012-02-02 08:41:22

是的,差不多就是这样。Just-in-time compilation可以通过将字节码的“热点”(已知/应该经常执行的字节码点)编译为本机指令来提高性能。On-Stack Replacement通过将长时间运行的解释型“热”字节码替换为编译后的版本来补充JIT功能。前面提到的On-Stack Replacement article展示了一个很好的例子,如果没有OSR,即时编译就不会很有用。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9105505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档