问:Java中的异常处理真的很慢吗?
传统观点以及许多谷歌搜索结果都认为,Java中的正常程序流不应该使用异常逻辑。通常给出两个原因,
-
它真的很慢,甚至比常规代码慢一个数量级(给出的原因各不相同),
和
-
这很混乱,因为人们只希望在异常代码中处理错误。
这个问题是关于#1的。
例如,
this page
将Java异常处理描述为“非常缓慢”,并将这种缓慢与异常消息字符串的创建联系起来——“然后将此字符串用于创建抛出的异常对象。这并不快。”
Effective Exception Handling in Java
说“原因在于异常处理的对象创建方面,这使得抛出异常本身就很慢”。另一个原因是堆栈跟踪生成会减慢它的速度。
我的测试(在32位Linux上使用Java 1.6.0_07、Java HotSpot 10.0)表明,异常处理并不比常规代码慢。我尝试在循环中运行一个方法来执行一些代码。在方法的末尾,我使用布尔值来指示是否
回
或
扔
这样实际处理是相同的。我尝试以不同的顺序运行这些方法,并平均我的测试时间,认为这可能是JVM正在预热。在我所有的测试中,投掷速度至少和回击速度一样快,如果不是更快的话(快3.1%)。我完全接受我的测试出错的可能性,但在过去的一两年里,我没有看到任何代码示例、测试比较或结果显示Java中的异常处理实际上很慢。
让我走上这条路的是我需要使用的API,它将抛出异常作为正常控制逻辑的一部分。我想纠正他们的用法,但现在我可能无法做到。我是否应该赞扬他们的前瞻性思维?
在纸上
Efficient Java exception handling in just-in-time compilation
,作者认为,即使没有抛出异常,仅存在异常处理程序也足以阻止JIT编译器正确优化代码,从而减缓其速度。我还没有检验这个理论。