您知道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 {} }
我愚蠢地没有很好地阅读我的代码,并且以前有一个错误(多么令人尴尬),如果有人可以三遍检查此代码,我非常乐意使用,以防万一我变老了。
我的规格是:
在我看来,您应该注意到,非异常方法不会在doSomethingElse中给出日志错误,而是返回一个布尔值,以便调用代码可以处理失败。如果有多个区域可能会失败,则可能需要在内部记录错误或引发异常。