首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当前的JIT是否为基于运行时统计数据的分支预测优化生成的机器代码?

当前的JIT是否为基于运行时统计数据的分支预测优化生成的机器代码?
EN

Software Engineering用户
提问于 2012-08-06 16:05:06
回答 2查看 2.3K关注 0票数 8

有些JVM会将Java字节代码编译成本机代码。我们知道有很多优化,我们可以申请。最近,我还了解到,如果CPU做错了预测,分支操作可能会阻塞CPU并显著影响性能。

有没有人知道是否有JVM会为CPU生成更容易的机器代码,根据收集的运行时统计数据进行正确的预测?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2015-02-25 22:56:17

不,HotSpot没有向硬件分支预测器如OpenJDK邮件列表中所述添加提示:

我们已经考虑过了,并决定反对。openjdk目前针对的平台都有不错的硬件分支预测。那些没有,如尼亚加拉1,忽略了预测比特。结论是,不值得像David所说的那样,将代码复杂化,使用“魔术宏”。

票数 6
EN

Software Engineering用户

发布于 2015-02-26 07:47:40

我的猜测是,对机器指令级别的预测暗示充其量不过是一种噪音,而在最坏的情况下,对现代的无序、推测执行的体系结构来说,是一种损害(浪费的指令字节)。这样做就像让CPU哑口无言--停止做它设计用来执行的已经很聪明的事情。

其次,分支预测的改进程度取决于错误预测的原因,以及对分支的性能影响和观察趋势的容易程度。

然而,即使没有CPU分支错误预测计数器的帮助,我认为现有的JIT优化技巧已经可以在一定程度上改进分支预测。

只是一个非常简单的代码示例:

代码语言:javascript
运行
复制
public void repeatHistory(int value)
{
    if (value == 1492)
    {
        landing();
    }
    else if (value == 1776)
    {
        ratifying();
    }
}

假设repeatHistory被多次调用。当基于抽样的性能监测器分析调用堆栈统计信息时,它可能会发现,无论出于什么原因,repeatHistory()调用ratifying()比前者调用landing()更频繁。基于这一观察,repeatHistory方法的下一次JIT代码生成将考虑到这一点,并执行一个或多个优化:

  • 在检查(value == 1776)之前移动(value == 1492)检查
  • 尝试将ratifying()方法内联到repeatHistory()中的分支中
  • 如果从另一个循环调用repeatHistory(),请尝试展开该循环,或将repeatHistory()方法内联到该循环中。
  • 还有很多其他人。

在应用了一种优化之后,通常需要再次进行分析,以确定是否可以应用更多的优化,因为成功的优化通常会为更多的机会打开大门。

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

https://softwareengineering.stackexchange.com/questions/159706

复制
相关文章

相似问题

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