【发布时间】:2014-02-12 01:49:19
【问题描述】:
我读过一些 JVM 可以通过删除边界检查来优化代码执行。我想弄清楚的是哪种编码技术会更好。
在下面的方法 example1 中,JVM 是否会弄清楚并消除对 source[index] 引用的边界检查?
example2 是更好的代码实践吗?看起来是这样,但在循环内的某些算法中,索引超出范围是正常情况。所以你不想在那个循环中生成大量的异常对象。
public void example1(int [] source, int index) {
if (index >= 0 && index < source.length)
System.out.println("Value is " + source[index]);
else
System.out.println("Out of range: " + index);
}
public void example2(int [] source, int index) {
try {
System.out.println("Value is " + source[index]);
} catch (IndexOutOfBoundsException exp) {
System.out.println("Out of range: " + index);
}
}
这些代码片段仅具有代表性。我知道在这些示例中,边界检查对性能几乎没有影响。但是,我正在开发一个嵌入式协议应用程序,其中冗余边界检查将加起来。
【问题讨论】:
-
This 这里一些同事的论文对你来说应该很有趣。我认为这些更改已包含在热点中,但不确定。无论如何,从性能和编码实践的角度来看,第二个示例肯定更差。
-
@AlanObject,边界检查是多个数量级,比对输出的调用要小。在大多数情况下,这没有任何区别。
标签: java bounds-check-elimination