Java异常有多慢?
问题:Java中的异常处理实际上很慢吗?
传统的智慧,以及谷歌的许多结果,都认为在Java中正常的程序流不应该使用特殊的逻辑。通常有两个原因,
- 它真的很慢-甚至比普通代码慢一个数量级(给出的原因各不相同),
和
- 这很麻烦,因为人们期望只有异常代码才能处理错误。
这个问题是关于#1的。
举个例子,本页将Java异常处理描述为“非常慢”,并将慢速与异常消息字符串的创建联系起来-“然后该字符串用于创建抛出的异常对象,这并不快。”文章Java中的有效异常处理他说:“这是因为异常处理的对象创建方面,从而使抛出异常的速度变慢”。另一个原因是堆栈跟踪生成减慢了它的速度。
我的测试(使用Java 1.6.0_07,Java HotSpot 10.0,在32位Linux上)表明异常处理并不比常规代码慢。我尝试在执行某些代码的循环中运行一个方法。在方法的末尾,我使用一个布尔值来指示是否回归或抛出..这样,实际处理是相同的。我尝试以不同的顺序运行这些方法,并平均测试时间,认为这可能是JVM的热身。在我所有的测试中,投球至少和返回速度一样快,如果不是更快的话(高达3.1%的速度)。我完全愿意相信我的测试是错误的,但在过去的一两年里,我还没有看到在代码示例、测试比较或结果中显示Java异常处理速度慢的任何东西。
导致我走上这条道路的是我需要使用的API,它将异常抛出作为正常控制逻辑的一部分。我想纠正他们的用法,但现在我可能不能。我会否因为他们的前瞻而赞扬他们呢?
在报纸上实时编译中有效的Java异常处理作者认为,仅存在异常处理程序,即使没有抛出异常,也足以阻止JIT编译器正确地优化代码,从而减慢代码的速度。我还没验证过这个理论