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

shr*_*000 3 java performance jvm try-catch

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

PL.请注意,问题不在于抛出异常的开销,而在于进入/离开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();       
}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*rey 9

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

for(int j = 0; j < 100000; j++) {
    i++;
}
Run Code Online (Sandbox Code Playgroud)

i += 100000 * 1;
Run Code Online (Sandbox Code Playgroud)

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


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

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

.

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