代码之家  ›  专栏  ›  技术社区  ›  John Ellinwood

Java中异常对性能有什么影响?

  •  557
  • John Ellinwood  · 技术社区  · 16 年前

    问:Java中的异常处理真的很慢吗?

    传统观点以及许多谷歌搜索结果都认为,Java中的正常程序流不应该使用异常逻辑。通常给出两个原因,

    1. 它真的很慢,甚至比常规代码慢一个数量级(给出的原因各不相同),

    1. 这很混乱,因为人们只希望在异常代码中处理错误。

    这个问题是关于#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编译器正确优化代码,从而减缓其速度。我还没有检验这个理论。

    18 回复  |  直到 5 年前