Jot*_*lla 10 java runtime jvm-hotspot bounds-check-elimination
"Hotspot可以删除Java中的边界检查." 有人可以解释一下吗?实际上我正在分析C++和Java之间的差异.这不是一个功课,我正在分析自己的兴趣.
在谷歌搜索"热点边界检查"后,出现了一个标题为"Java HotSpot™客户端编译器的阵列边界检查消除 " 的论文(作为第一个结果)并给出了一些见解:
抽象:
每当访问数组元素时,Java虚拟机都会执行比较指令以确保索引值在有效范围内.这降低了Java程序的执行速度.数组边界检查消除可识别此类检查冗余且可以删除的情况.我们基于即时编译器中的静态分析,为Java HotSpot™VM提供了数组边界检查消除算法.
该算法以静态单一赋值形式处理中间表示,并维护索引表达式的条件.如果可以证明它们永远不会失败,它会完全删除边界检查.只要有可能,它就会将边界检查移出循环.静态检查数保持不变,但循环内的检查可能会更频繁地执行.如果这样的检查失败,则执行程序将回退到解释模式,从而避免在错误的位置抛出异常的问题.
评估显示科学SciMark基准测试套件的理论最大值接近加速(平均为40%).该算法还提高了SPECjvm98基准测试套件的执行速度(平均为2%,最大为12%).
马克梅奥很好地解释了这一点.
底线:如果Hotspot检测到没有必要检查数组的边界,它会将此视为一个机会来禁用对该数组的边界检查,从而提高性能.