Java 缩小捕捉块的类型是否会影响性能?
变革的绩效内涵是什么Java 缩小捕捉块的类型是否会影响性能?,java,Java,变革的绩效内涵是什么 try { canThrowDifferentExceptions(); } catch (Exception e) { // handle exception } 到 我认为过于宽泛的catch块会产生隐藏未计划的异常的风险,但我对multi-catch的性能特征感到好奇。唯一的区别是,在multi-catch的情况下,异常表只指向一条线,而在另一条线上它指向正确的catch线 唯一的其他区别是非多重捕获结束时的goto 对于单个捕获(异常e),表异常仅包含一行
try {
canThrowDifferentExceptions();
} catch (Exception e) {
// handle exception
}
到
我认为过于宽泛的catch块会产生隐藏未计划的异常的风险,但我对multi-catch的性能特征感到好奇。唯一的区别是,在multi-catch的情况下,异常表只指向一条线,而在另一条线上它指向正确的catch线 唯一的其他区别是非多重捕获结束时的
goto
对于单个捕获(异常e)
,表异常仅包含一行请求加宽转换,不引入开销
总的来说,基于一次转到的成本,goto
,您不应该期望有任何性能差异
测试代码:
public static void main(final String[] args) {
int i = 0;
try {
if (i == 1) {
throw new NullPointerException();
} else if (i == 2) {
throw new ArrayIndexOutOfBoundsException();
} else {
throw new IllegalStateException();
}
} catch (NullPointerException | ArrayIndexOutOfBoundsException
| IllegalStateException e) {
}
}
与非多重捕获相比,区别在于:
32c32,36
< 37: return
---
> 37: goto 45
> 40: astore_2
> 41: goto 45
> 44: astore_2
> 45: return
// Exception table:
// from to target type
// 2 36 36 Class java/lang/NullPointerException
36,37c40,41
< 2 36 36 Class java/lang/ArrayIndexOutOfBoundsException
< 2 36 36 Class java/lang/IllegalStateException
---
> 2 36 40 Class java/lang/ArrayIndexOutOfBoundsException
> 2 36 44 Class java/lang/IllegalStateException
性能问题?这是一个例外,一个意外的情况(大多数情况下)。你能给我解释一下在什么情况下,这可能会成为任何程序的瓶颈吗?这绝对是特定于实现的。我对优化特定程序不感兴趣,我正在尝试研究缩小捕获的异常类型是否作为一种通用的最佳实践是有意义的。我也很乐意得到特定于实现的响应。multi-catch是jdk 7上的一个新功能,只是为了让代码更易于阅读,如果你对每个catch异常都这样做的话。我认为这是否是一个“通用”的最佳实践的问题实际上与性能无关,而是与安全性有关。在任何情况下,似乎反汇编程序或多或少都会回答这个问题,尽管在JIT之后,几乎大多数赌注都没有了。这看起来像是单独的catch块与单个multi-catch块之间的区别,但我也对过去是否只有一个
catch(异常e)
块感兴趣。编辑以添加比较
32c32,36
< 37: return
---
> 37: goto 45
> 40: astore_2
> 41: goto 45
> 44: astore_2
> 45: return
// Exception table:
// from to target type
// 2 36 36 Class java/lang/NullPointerException
36,37c40,41
< 2 36 36 Class java/lang/ArrayIndexOutOfBoundsException
< 2 36 36 Class java/lang/IllegalStateException
---
> 2 36 40 Class java/lang/ArrayIndexOutOfBoundsException
> 2 36 44 Class java/lang/IllegalStateException
// Exception table:
// from to target type
< 2 36 36 Class java/lang/NullPointerException
< 2 36 36 Class java/lang/ArrayIndexOutOfBoundsException
< 2 36 36 Class java/lang/IllegalStateException
---
> 2 36 36 Class java/lang/Exception