一个try-catch块的位置会影响性能吗?

7

放置try-catch块是否影响性能?

示例1:将try-catch块放在while循环的内部

while (true) {
    try {
        // ... read from a file
    } catch (EOFException e) {
        break;
    }
}

例子2:try-catch块包围while循环

try {
    while (true) {
        // ... read from a file
    } 
} catch (EOFException e) {
    // :P
}

从逻辑上看,这两个例子是等价的,但我应该选择哪一个?


7
这两个代码示例并不等同。 - krock
1
在第二种情况下,你肯定不想要 break;语句。不然你的程序要么无法编译,要么就会跳出错误的循环。 - user315772
正如其他人所指出的那样,这些代码示例并不相同。如果你不在循环中,就不能真正地从中跳出来。但无论如何,有什么阻止你进行基准测试呢?这是一段非常简单的基准测试代码。 - Wolph
@krock:我一直在等待有人这么说;从高层次来看,它在我的代码中是等价的。稍后我会发布一个完整的代码示例,但希望你已经理解了问题。 - Mr. White
@所有人: 第二个断点是复制/粘贴时的错误。 - Mr. White
5个回答

4

Java中的try块应该尽可能地局部化吗?

这篇文章提供了比我更好的答案。简单来说,它们只会在抛出异常时添加一个条目到表中,所以除非抛出异常,否则不会影响性能。最好将其放置在最有利于恢复的位置,如果可以的话。如果不行,放在有用或合理的地方即可。 虽然break在循环外的情况下,我认为第二个选项无效。


第二个break是复制/粘贴的错误。 - Mr. White

2

try-catch所带来的额外负担可能微不足道,但是第一种情况让我更加疑惑的是:你捕获了一个异常,只是为了中止循环。我会选择方案2,因为它与意图保持一致。这样做可以避免任何额外负担。


第二个break是复制/粘贴时的错误。 - Mr. White
2
我没有提到那件事。我知道那是一个错误,但因为你已经清楚地表达了你的意图,所以我选择忽略它。 - user315772

0

try-catch块的位置对应用程序的性能没有任何影响。即使有影响,它也是完全可以忽略的,因为那不是你想要集中精力的地方。首先根据需要实现,然后进行优化。不要进行微观优化。


-1

你能从 while 循环外面跳出来吗?我不认为你的前提假设,即这两者是等价的,是正确的。

我的直觉告诉我,在循环外使用 try/catch 更好。如果编写 try/catch 会对字节码产生影响,则创建较少的 try/catch 更好。如果除非发生异常,否则没有影响,则无关紧要。我没有看到任何情况下将 try/catch 放在内部更好。

我可能错了...


第二个break是复制/粘贴时的错误。 - Mr. White

-1
第二个例子(try-catch块包围代码)既更快也更清晰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,