首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >及时编译总是更快吗?

及时编译总是更快吗?
EN

Stack Overflow用户
提问于 2011-01-15 00:42:31
回答 3查看 1.5K关注 0票数 6

在堆栈溢出上向这里的所有编译器设计人员致意。

我目前正在从事一个项目,重点是开发一种用于高性能计算的新脚本语言。源代码首先被编译成字节代码表示形式。字节代码随后由运行时加载,运行时对其执行积极的(可能也是耗时的)优化(这比大多数“提前”编译器所做的(毕竟这是项目的全部内容)要深入得多。请记住,这个过程的结果仍然是字节码。

然后在虚拟机上运行字节码。目前,这个虚拟机是使用直进跳转表和消息泵实现的.虚拟机使用指针运行字节代码,加载指针下的指令,在跳转表中查找指令处理程序并跳入其中。指令处理程序执行适当的操作,最后将控制返回给消息循环。虚拟机的指令指针增加,整个过程重新开始。我用这种方法所能达到的性能实际上是相当惊人的。当然,实际指令处理程序的代码也是手工微调的。

现在大多数“专业”运行时环境(如Java、.NET等)在执行之前,使用即时编译将字节代码转换为本机代码。使用JIT的VM通常比字节代码解释器具有更好的性能。现在的问题是,由于解释器基本上只会加载指令并在跳转表中查找跳转目标(请记住,指令处理程序本身是静态编译到解释器中的,因此它已经是本机代码),使用实时编译会带来性能提高还是实际上会降低性能?我无法想象解释器的跳转表会降低性能,以弥补使用JITer编译代码所花费的时间。我知道JITer可以对代码执行额外的优化,但在我的示例中,在执行之前已经在字节代码级别上执行了非常激进的优化。您认为用JIT编译器替换解释器可以获得更快的速度吗?如果是,为什么?

我知道,实现这两种方法和基准将为这个问题提供最准确的答案,但如果有一个明确的答案,可能不值得花时间。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-15 00:55:17

答案在于单字节代码指令复杂度与跳转表开销的比率。如果您正在建模像大型矩阵乘法这样的高级别操作,那么一点开销将是微不足道的。如果要增加单个整数,那么跳转表当然会对其产生极大的影响。总的来说,这种平衡将取决于语言所使用的时间越长的任务的性质。如果它是一种通用语言,那么对于每一件事来说,最少的开销就更有用了,因为您不知道在紧循环中将使用什么。要快速量化潜在的改进,只需对一些嵌套循环进行基准测试,这些循环执行一些简单的操作(但那些操作无法优化),而不是一个等价的C或C++程序。

票数 4
EN

Stack Overflow用户

发布于 2011-03-08 17:05:34

当使用解释器时,处理器中的代码缓存缓存解释器代码,而不是字节代码(可以缓存在数据缓存中)。由于代码缓存比数据缓存快2到3倍,IIRC;如果JIT编译,您可能会看到性能的提高。而且,您正在执行的本机真正代码可能是PIC;对于JITted代码来说,这是可以避免的。

其他一切取决于如何优化字节码,IMHO。

票数 2
EN

Stack Overflow用户

发布于 2011-01-15 00:54:56

理论上,JIT可以更好地优化,因为它的信息在编译时不可用(特别是关于典型的运行时行为)。因此,例如,它可以做更好的分支预测,根据需要展开循环,等等。

我确信您的可跳方法是可以的,但是我仍然认为它的性能比直接的C代码要差得多,您不认为吗?

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

https://stackoverflow.com/questions/4697359

复制
相关文章

相似问题

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