可以在Java / Scala中禁用边界检查吗?

时间:2017-03-02 12:20:12

标签: java arrays scala memory-management jvm

我们知道Java在每个数组元素访问时都会检查索引是否不在边界之内。但在某些情况下,例如Scala中的map函数,编译器/库将自己处理索引,从而保证没有越界访问。

因此,出于性能原因,可以在JVM中为代码的某些部分禁用此类边界检查吗?

1 个答案:

答案 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;
  }