在没有数组边界检查、强制转换检查等的情况下运行 Java

Posted

技术标签:

【中文标题】在没有数组边界检查、强制转换检查等的情况下运行 Java【英文标题】:Run Java without Array Bounds checking, Cast checking, etc 【发布时间】:2016-05-13 12:05:32 【问题描述】:

我有一个 Java 程序,它执行许多小数组操作。我已经运行它并验证它不会产生错误,但它比预期的要慢。我假设很多这种减速与检查数组边界等有关。

有没有办法禁用所有错误检查,以便我可以更快地运行我的程序(冒着崩溃的风险,而不是生成一个可理解的错误)?

【问题讨论】:

您可以改为解释您的阵列试图解决的问题,它会更容易帮助您。它或多或少不建议尝试通过 hack 使您的代码更快。 Java 编译器几乎 100% 的时间都会击败您的代码。 您是如何得出问题在于边界检查的结论的?您是否对您的应用程序进行了概要分析?您是否将边界检查确定为瓶颈? 【参考方案1】:

不,这是不可能的。 Java 语言规范描述了强制转换和数组访问引发异常的情况,但没有提到禁用这种行为的机制。

ClassCastException 的投掷在JLS Section 15.6 中有描述:

如果在运行时发现强制类型转换是不允许的,则类型转换表达式(第 15.16 节)将引发 ClassCastException。

数组边界检查在JLS Section 15.10.4中描述:

在运行时,数组访问表达式的求值行为如下:

首先,计算数组引用表达式。如果这个求值突然完成,那么数组访问也会因为同样的原因而突然完成,并且索引表达式不会被求值。

否则,将评估索引表达式。如果这个求值突然完成,那么数组访问也会因为同样的原因而突然完成。

否则,如果数组引用表达式的值为null,则抛出NullPointerException。

否则,数组引用表达式的值确实引用了一个数组。如果索引表达式的值小于零,或者大于或等于数组的长度,则抛出ArrayIndexOutOfBoundsException

否则,数组访问的结果是数组中T类型的变量,由索引表达式的值选择。

【讨论】:

【参考方案2】:

不,这是不可能的,因为这会在出错时破坏 JVM。

【讨论】:

以上是关于在没有数组边界检查、强制转换检查等的情况下运行 Java的主要内容,如果未能解决你的问题,请参考以下文章

SV强制类型转换和常数

从 JSON 检查空数组

C++强制类型转换操作符 dynamic_cast

我可以在没有循环的情况下检查数组/向量内的单词吗?

如何消除对这个循环向量化的数组边界检查?

多用as少用强制类型转换