gpt4 book ai didi

java - Java 边界检查优化示例

转载 作者:行者123 更新时间:2023-12-03 21:54:19 24 4
gpt4 key购买 nike

我读到,一些 JVM 可以通过删除边界检查来优化代码执行。我试图找出哪种编码技术效果更好。

在下面的方法 example1 中,JVM 是否能够弄清楚并消除 source[index] 引用的边界检查?

example2 是更好的代码实践吗?看起来是这样,但在循环内的某些算法中,索引越界是正常情况。因此,您不想在该循环内生成大量 Exception 对象。

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);
}
}

这些代码片段仅具有代表性。我知道在这些示例中,边界检查对性能几乎没有影响。不过,我正在开发一个嵌入式协议(protocol)应用程序,其中冗余边界检查将会增加。

最佳答案

对于你的第一个问题,在 example1 中,边界检查理论上可以被消除。我希望最好的现代 JIT 编译器能够做到这一点(例如,当扩展 source[index] 时,可能通过边界检查中的公共(public)子表达式消除)。像往常一样,这将取决于实现,因此您不能依赖它。 OTOH,即使没有消除边界检查,差异也将是微不足道的 - 您将访问已经缓存的内存位置的 source.length 并进行几个整数比较,因此开销很小。

example2 不是一个好的实践 - 您遇到了异常,但随后捕获它并继续,就好像什么也没发生一样。除非您仔细观察标准输出,否则您可能会完全忽略代码中存在错误的事实。

基本上有两种常见的“好”可能性,具体取决于您认为“索引”的有效输入:

  1. 越界索引值是预期并被视为有效输入。在您应该测试并处理哪种情况明确如示例 1 所示。在这种情况下,您不需要抛出任何类型的异常。

  2. 索引越界是意外的(因此是调用代码中的错误)。您的代码应该在此处引发异常。如果您愿意,可以使用自己的消息捕获并重新抛出异常,但也可以让 IndexOutOfBounds 异常传播。不要担心此异常处理对性能的影响 - 您刚刚发现了一个错误,因此您希望程序尽可能快地“大声”失败......

关于java - Java 边界检查优化示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6563884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com