当前位置: 首页 > 面试题库 >

异常的代价是多少

林礼骞
2023-03-14
问题内容

您知道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();
}

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


问题答案:

我没有花时间去阅读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中给出日志错误,而是返回一个布尔值,以便调用代码可以处理失败。如果有多个区域可能会失败,则可能需要在内部记录错误或引发异常。



 类似资料:
  • 问题内容: 我以前没有听说过,但是我对Python还是比较陌生。异常处理意味着动态调用和静态返回,而语句是静态调用,静态返回。 如何进行检查是好是坏,似乎正好相反。谁可以给我解释一下这个? 问题答案: 您可能会发现这篇文章很有帮助: 尝试/除Python以外的性能:简单测试 ,Patrick Altman进行了一些简单的测试,以了解在各种条件下进行条件检查(在这种情况下特定于字典键)的性能(仅针对

  • 问题内容: (不要与流行的.Net单元测试库Xunit混淆。) 今天,我无聊地开始检查Gmail DOM(是的,我很无聊)。 一切看起来都很简单,直到我注意到某些元素的宽度有趣的规范为止。杰出的Googlites使用稀有的“ ex”单位指定了多个表格列。 起初我很困惑(“什么是’ex’?”),然后又回到了我的脑海:我似乎还记得几年前第一次学习CSS时的一些事情。根据CSS3规范: [ ex单位 ]

  • 我们知道捕获异常的代价很高。但是,即使从未抛出异常,在Java中使用try-catch块是否也会很昂贵呢? 我发现堆栈溢出问题/答案为什么try块很贵?,但它是针对.NET的。

  • 本章主要列出 JA 的错误代码,供开发者参考 异常代码 描述 原因 解决方案 2000 Success - - 5000 Failure 多为系统异常,如 JA 本身的 BUG,或者其他原因 请参考控制台异常栈 5001 Not Implemented 方法未实现 ① 针对自定义的 oauth 平台,请检查你的代码,是否存在未实现必要接口的问题; ② 针对 JA 内置的平台,说明该平台的某个方法暂

  • 我正试图为以下情况想出一个算法:我想在一个无向图上运行一个最小代价算法。边有一个与之相关的代价,顶点有两个与之相关的代价。这就是它变得有点棘手的地方。我必须选择与顶点相关的2个成本中的一个。如果我选择cost1,顶点将属于类型1,如果我选择cost2,顶点将属于类型2。只有当顶点具有不同的类型时,它们才能被认为是由一条边连接的。大多数时候,为顶点选择成本最低的顶点是合乎逻辑的,但是根据与它相关联的

  • 我正在尝试编写允许我做4件事的代码,我正在使用try和except。 代码如下: 但我还需要使用2个例外。你能给我解释一下我怎么做吗? 主要目标是下载一个文件;如果仍然没有,下载第二个文件,依此类推。