【问题标题】:Java: overhead of entering/using "try-catch" blocks?Java:输入/使用“try-catch”块的开销?
【发布时间】:2012-04-27 12:28:50
【问题描述】:

问题说明了一切。尽管命中不是很显着(我测得它慢了 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();       
}

【问题讨论】:

  • 请说明您是如何衡量的。众所周知,基准测试很难做到正确。
  • 另外:try-catch 不仅体现在字节码中,还体现在方法的代码属性中。换句话说:您只能在字节码中看到 try-catch 实现的 部分
  • 这里的问题可能有您寻求的答案。不确定这是否可以被视为重复问题:stackoverflow.com/questions/2633834/…
  • @Hassan,同意;但是如果谨慎使用try-catch,它不会显着影响整体性能。当您在长循环中执行它时,可以看到我显示的命中。
  • @Joachim Sauer:谢谢!你能请。详细点?

标签: java performance jvm try-catch


【解决方案1】:

由于您有一个微基准测试,因此您更有可能测试 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
}

【讨论】:

  • 谢谢(和+1)以获得详细的答案。但我想衡量“进入”一个 try 块的成本。在你建议的方法中,我可能无法测量它。
  • 我相信代价只是它可能会通过使代码更复杂来阻止 JVM 的微优化。例如方法通常只有在 35 个字节或更少时才被内联。 try/catch 块可能会添加一些字节,这可能会阻止内联。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    相关资源
    最近更新 更多