3

这个问题说明了一切。尽管命中不是很显着(我测量它慢了 1.5 倍到 2 倍),但带有 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();       
}
4

2 回答 2

9

由于您有一个微基准,因此您更有可能测试 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
}
于 2012-04-16T07:19:38.787 回答
2

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

于 2013-09-21T22:13:36.363 回答