【问题标题】:Bounds Checking in JavaJava中的边界检查
【发布时间】:2011-05-27 01:12:51
【问题描述】:

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

【问题讨论】:

  • 上下文是什么,你有一个你在说什么的例子吗?这是作业题吗?
  • 大概来自en.wikipedia.org/wiki/Comparison_of_Java_and_C%2B%2B,其中比较两种语言有“通常执行边界检查。HotSpot 可以删除边界检查。”来自Java?

标签: java runtime jvm-hotspot bounds-check-elimination


【解决方案1】:

在谷歌上搜索“热点边界检查”后,a Paper with the Title "Array Bounds Check Elimination for the Java HotSpot™ Client Compiler" 出现(作为第一个结果)并为我们提供了一些见解:

摘要:

每当一个数组元素被访问时, Java 虚拟机执行一个 比较指令,以确保 索引值在有效范围内 界限。这减少了执行 Java 程序的速度。数组边界 检查消除标识 此类检查的情况 多余的,可以删除。我们 提出数组边界检查 Java的消除算法 基于静态分析的 HotSpot™ VM 在即时编译器中。

该算法适用于中间体 静态单曲中的表示 分配表格和维护 索引表达式的条件。它 如果可以,则完全删除边界检查 证明他们永远不会失败。 只要有可能,它就会移动界限 检查出循环。静态号码 检查的数量保持不变,但 循环内部的检查很可能是 更频繁地执行。如果这样的检查 失败,执行程序落下 回到解释模式,避免 抛出异常的问题 放错地方了。

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

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

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

【讨论】:

  • 这似乎是第三方研究论文。编写它的人有没有将他们的实现真正合并到 Hotspot 中?
  • 论文的一位作者Thomas Würthinger 现在在 Oracle 从事 Graal 编译器的工作。该论文指出“……我们在 Java HotSpot TM VM 中实现该算法。它目前已集成到 JDK 7 [16] 的早期访问版本 b04 中。”所以它很可能被包括在内(如果它没有被删除的话)。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多