Java:输入/使用“try-catch”块的开销?

这个问题说明了一切。 虽然命中率不是很高(我测量它的速度在1.5x到2x之间),但是try-catch的字节代码与没有try-catch的字节代码之间没有区别。 那么是什么让它通常变慢?

PL。 请注意,问题不在于抛出exception的开销,而在于进入/离开try块。

编辑:这是代码(在Hotspot 1.6.0_31服务器上运行)

static void tryCatch() { int i = 0; long l1 = getTime(); for(int j = 0; j < 100000; j++) { try { i++; } catch(Exception e) { } } long l2 = getTime(); System.out.println("with try-catch: " + (l2 - l1) + ": " + i); } static void noTryCatch() { int i = 0; long l1 = getTime(); for(int j = 0; j < 100000; j++) { i++; } long l2 = getTime(); System.out.println("w/o try-catch: " + (l2 - l1) + ": " + i); } static long getTime() { return System.nanoTime(); } 

EDIT2:发现这个实际执行此类测试的好链接: http : //jsperf.com/try-catch-overhead

由于您有一个微基准测试,因此您更有可能测试try / catch块与JVM编译器的混淆程度。 例如,JVM可以足够智能地进行更改

 for(int j = 0; j < 100000; j++) { i++; } 

 i += 100000 * 1; 

使用try / catch块可能会阻止更具侵略性的优化,但对于更真实的代码块可能没有任何区别。


在任何情况下,我通常会改变类似的东西

 for(int j = 0; j < 100000; j++) { try { // do something } catch(Exception e) { // break or return } } 

 try { for(int j = 0; j < 100000; j++) { // do something } } catch(Exception e) { // continue or return } 

我的另一个问题的微基准测试表明,使用/不使用try-catch块之间没有显着差异,无论是否在块中抛出exception。