在没有数组边界检查、强制转换检查等的情况下运行 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的主要内容,如果未能解决你的问题,请参考以下文章