小编典典

异常的代价是多少

java

您知道Java中引发和处理异常的代价是多少?

我们在团队中就异常的实际成本进行了多次讨论。一些人尽可能地避免使用它们,有人说使用异常会导致性能损失被高估。

今天,我在我们的软件中找到了以下代码:

private void doSomething()
{
    try
    {
      doSomethingElse();
    }
    catch(DidNotWorkException e)
    {
       log("A Message");
    }
    goOn();
}
private void doSomethingElse()
{
   if(isSoAndSo())
   {
      throw new DidNotWorkException();
   }
   goOnAgain();
}

与之相比,它的性能如何

private void doSomething()
{
    doSomethingElse();
    goOn();
}
private void doSomethingElse()
{
   if(isSoAndSo())
   {
      log("A Message");
      return;
   }
   goOnAgain();
}

我不想讨论代码美感或其他任何内容,而只是关于运行时行为!您有真实的经验/测量方法吗?


阅读 223

收藏
2020-09-21

共1个答案

小编典典

我没有花时间去阅读Exception,但是用您的一些修改后的代码进行了非常快速的测试,我得出的结论是Exception情况比boolean情况要慢得多。

我得到以下结果:

Exception:20891ms
Boolean:62ms

从此代码:

public class Test {
    public static void main(String args[]) {
            Test t = new Test();
            t.testException();
            t.testBoolean();
    }
    public void testException() {
            long start = System.currentTimeMillis();
            for(long i = 0; i <= 10000000L; ++i)
                    doSomethingException();
            System.out.println("Exception:" + (System.currentTimeMillis()-start) + "ms");
    }
    public void testBoolean() {
            long start = System.currentTimeMillis();
            for(long i = 0; i <= 10000000L; ++i)
                    doSomething();
            System.out.println("Boolean:" + (System.currentTimeMillis()-start) + "ms");
    }

    private void doSomethingException() {
        try {
          doSomethingElseException();
        } catch(DidNotWorkException e) {
           //Msg
        }
    }
    private void doSomethingElseException() throws DidNotWorkException {
       if(!isSoAndSo()) {
          throw new DidNotWorkException();
       }
    }
    private void doSomething() {
        if(!doSomethingElse())
            ;//Msg
    }
    private boolean doSomethingElse() {
       if(!isSoAndSo())
          return false;
       return true;
    }
    private boolean isSoAndSo() { return false; }
    public class DidNotWorkException extends Exception {}
}

我愚蠢地没有很好地阅读我的代码,并且以前有一个错误(多么令人尴尬),如果有人可以三遍检查此代码,我非常乐意使用,以防万一我变老了。

我的规格是:

  • 编译并在1.5.0_16上运行
  • Sun JVM
  • WinXP SP3
  • 英特尔迅驰双核T7200(2.00Ghz,977Mhz)
  • 2.00 GB内存

在我看来,您应该注意到,非异常方法不会在doSomethingElse中给出日志错误,而是返回一个布尔值,以便调用代码可以处理失败。如果有多个区域可能会失败,则可能需要在内部记录错误或引发异常。

2020-09-21