有些JVM会将Java字节代码编译成本机代码。我们知道有很多优化,我们可以申请。最近,我还了解到,如果CPU做错了预测,分支操作可能会阻塞CPU并显著影响性能。
有没有人知道是否有JVM会为CPU生成更容易的机器代码,根据收集的运行时统计数据进行正确的预测?
发布于 2015-02-25 22:56:17
不,HotSpot没有向硬件分支预测器如OpenJDK邮件列表中所述添加提示:
我们已经考虑过了,并决定反对。openjdk目前针对的平台都有不错的硬件分支预测。那些没有,如尼亚加拉1,忽略了预测比特。结论是,不值得像David所说的那样,将代码复杂化,使用“魔术宏”。
发布于 2015-02-26 07:47:40
我的猜测是,对机器指令级别的预测暗示充其量不过是一种噪音,而在最坏的情况下,对现代的无序、推测执行的体系结构来说,是一种损害(浪费的指令字节)。这样做就像让CPU哑口无言--停止做它设计用来执行的已经很聪明的事情。
其次,分支预测的改进程度取决于错误预测的原因,以及对分支的性能影响和观察趋势的容易程度。
然而,即使没有CPU分支错误预测计数器的帮助,我认为现有的JIT优化技巧已经可以在一定程度上改进分支预测。
只是一个非常简单的代码示例:
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()
方法内联到该循环中。在应用了一种优化之后,通常需要再次进行分析,以确定是否可以应用更多的优化,因为成功的优化通常会为更多的机会打开大门。
https://softwareengineering.stackexchange.com/questions/159706
复制相似问题