我们知道Java在每个数组元素访问时都会检查索引是否不在边界之内。但在某些情况下,例如Scala中的map函数,编译器/库将自己处理索引,从而保证没有越界访问。
因此,出于性能原因,可以在JVM中为代码的某些部分禁用此类边界检查吗?
答案 0 :(得分:2)
不,不能禁用数组范围检查。这将使JVM不安全。
然而,JIT编译器可能能够推断出某些范围检查是不必要的并且将它们优化掉。
此外,JIT编译器可能会为某些内置类型执行“聪明的事情”。您可以通过在本机代码中实现内容来解决问题,尽管您可能会发现进行本机调用的开销会淹没本机执行计算的成本。
你能否展示一些示例代码,JIT会推断不需要进行边界检查?
并非没有时间比我愿意花费更多时间: - )
但是,JIT编译器理论上可以推断出这里不需要数组边界检查:
public int sum(int[] array) {
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
}
在这种情况下,简单的窥孔优化应该消除循环体中的第二个边界检查:
public int sum2(int[] array) {
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
sum += array[i];
}
return sum;
}