问:Java中的异常处理真的很慢吗?
传统观点以及大量谷歌结果表明,不应该将异常逻辑用于Java中的正常程序流。通常会给出两个原因,
而且
这个问题是关于第一条的。
作为一个例子,这个页面将Java异常处理描述为“非常慢”,并将这种慢与异常消息字符串的创建联系起来——“这个字符串随后用于创建抛出的异常对象。这并不快。”文章Java中有效的异常处理说:“造成这种情况的原因是异常处理的对象创建方面,从而导致抛出异常本身就很慢”。另一个原因是堆栈跟踪生成减慢了它的速度。
我的测试(使用Java 1.6.0_07, Java HotSpot 10.0,在32位Linux上)表明异常处理并不比常规代码慢。我尝试在循环中运行一个方法来执行一些代码。在方法的最后,我使用一个布尔值来指示是返回还是扔。这样实际的处理过程是一样的。我尝试以不同的顺序运行这些方法,并平均我的测试时间,我认为这可能是JVM预热的结果。在我的所有测试中,投掷速度至少和返回速度一样快,如果不是更快的话(快了3.1%)。我完全接受我的测试是错误的可能性,但是在过去一两年的代码示例、测试比较或结果中,我没有看到任何东西表明Java中的异常处理实际上是缓慢的。
引导我走上这条路的是我需要使用的一个API,它将抛出异常作为正常控制逻辑的一部分。我想纠正它们的用法,但现在我可能做不到。我是否应该赞美他们的前瞻思维?
在论文即时编译中的高效Java异常处理中,作者建议,即使没有抛出异常,仅异常处理程序的存在就足以阻止JIT编译器正确优化代码,从而降低代码的速度。我还没有测试过这个理论。