11

“Hotspot 可以删除 Java 中的边界检查。” 任何人都可以解释一下吗?实际上我正在分析 C++ 和 Java 之间的差异。这不是家庭作业,我根据自己的兴趣进行分析。

4

2 回答 2

8

在谷歌搜索“热点边界检查”之后,出现了一篇标题为“Java HotSpot™ 客户端编译器的数组边界检查消除”的论文(作为第一个结果),并为我们提供了一些见解:

抽象的:

每当访问数组元素时,Java 虚拟机都会执行比较指令以确保索引值在有效范围内。这会降低 Java 程序的执行速度。数组边界检查消除识别这些检查是多余的并且可以删除的情况。我们提出了一种 Java HotSpot™ VM 的数组边界检查消除算法,该算法基于即时编译器中的静态分析。

该算法以静态单一赋值形式处理中间表示,并维护索引表达式的条件。如果可以证明它们永远不会失败,它将完全删除边界检查。只要有可能,它就会将边界检查移出循环。检查的静态数量保持不变,但循环内的检查可能会更频繁地执行。如果这样的检查失败,正在执行的程序会退回到解释模式,避免了在错误的地方抛出异常的问题。

评估显示,科学 SciMark 基准套件的加速比接近理论最大值(平均 40%)。该算法还提高了 SPECjvm98 基准套件的执行速度(平均 2%,最大 12%)。

Mark Mayo 很好地解释了这一点。

底线:如果 Hotspot 检测到不需要检查数组的边界,它会将此视为禁用该数组的边界检查并因此提高性能的机会。

于 2010-12-17T10:21:44.497 回答
1

它的工作原理是不断分析程序的性能,寻找可能经常或重复执行的“热点”,然后将其作为优化目标,以最小的开销实现高性能执行,以获得对性能要求不高的代码。

所以理论上,如果有一些边界检查,并且通过重复和频繁的执行很明显它不可能超过边界,热点可能会优化这些检查。并不意味着它是万无一失的,但这可能是它发生的原因之一。

来自Würthinger 等人2007 年的一篇文章:“每当访问数组元素时,Java 虚拟机都会执行比较指令以确保索引值在有效范围内。这会降低 Java 程序的执行速度。数组边界检查消除识别“这种检查是多余的并且可以删除的情况。我们提出了一种基于即时编译器中的静态分析的 Java HotSpot™ VM 的数组边界检查消除算法。”

于 2010-12-17T10:21:53.147 回答