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

标签 java arrays scala memory-management jvm

我们知道Java在每次访问数组元素时都会检查索引是否越界。但在某些情况下,例如 Scala 中的映射函数,编译器/库将自行处理索引,从而保证不会出现越界访问。

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

最佳答案

不,无法禁用数组范围检查。这将使 JVM 变得不安全。

但是,JIT 编译器可能能够推断出某些范围检查是不必要的,并将其优化掉。

此外,JIT 编译器可能会对某些内置类型执行“聪明的操作”。您可以通过在 native 代码中实现一些内容来回避这个问题,尽管您可能会发现进行 native 调用的开销淹没了 native 计算的节省。

<小时/>

Can you maybe show some example code, where JIT would infer no bounds checking is required?

并非没有人花费比我愿意更多的时间:-)

但是,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;
  }

关于java - Java/Scala 中可以禁用边界检查吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42555375/

相关文章:

c++ - 使用指针c++的问题

java - 从 Hangman 的 char [] 数组中删除所有非唯一字母

php - 在数组的每个可能组合中创建几个单词

java - 提交时将表单字段转换为对象

java - 如何通过 Open Graph 标签 friend 使用 facebook api taggable_friends

Java Kryonet 发送对象时出错

java - 如何编译java源代码?

java - 在 Java 中抽象推送通知

复杂列表的json序列化

java - Play 不断写入光盘?在 Amazon ec2 上导致更高的账单