Akashic Records

The Cost of an Exception 본문

오래된글/Articles

The Cost of an Exception

Andrew's Akashic Records 2018. 4. 19. 14:20
728x90

원문: http://blog.dynatrace.com/2011/04/12/the-cost-of-an-exception/


The Cost of an Exception

최근에 “Exception” 비용에 대한 큰 논의가 dynatrace에서 있었다고 합니다. 대부분의 고객이 Exception이  Application Performance에 미치는 영향에 대해서 고려하지 않는다고 한다.

Exception 비용을 측정할 수 있는 간략한 Code를 작성해 그 영향을 살펴 보도록 하겠습니다.


Exception Test Code


package me.blog.inter999.cost;


public class ExceptionTest {

 public long maxLevel = 20;

 public static void main (String ... args){

   ExceptionTest test = new ExceptionTest();

   long start = System.currentTimeMillis();

   int count = 10000;

   for (int i= 0; i < count; i++){

     try {

       test.doTest(2, 0);

     }catch (Exception ex){

       ex.getStackTrace();

     }

   }

   long diff = System.currentTimeMillis() - start;

   System.out.println(String.format("Average time for invocation: %1$.5f",((double) diff)/count));

 }

 public void doTest (int i, int level){

     if (level < maxLevel){

       try {

         doTest (i, ++level);

       }

       catch (Exception ex){

         //ex.getStackTrace();

         throw new RuntimeException ("UUUPS", ex);

       }

     }

     else {

       if (i > 1) {

         throw new RuntimeException("Ups".substring(0, 3));

       }

     }

 }

}


Code Flow

  1. main에서 “doTest” 실행

  2. doTest는 제귀적 방법으로 maxLevel(20번) 만큼 자기 자신을 호출하고 maxLevel 이상이되면 Exception 발생

  3. main내에서 “1번”이 for 문장으로 10000번 실행됨.

  4. Exception은 총 10000번 발생하는 결과임.


Test Case

Test는 doTest Method의 Catch문장 내의 Exception 처리를 3가지 방법으로 테스트 하였습니다.

  1. throw만 처리

  2. StackTrace만 처리

  3. throw, StackTrace 둘 다 처리


Test Result


Case 1

catch (Exception ex){

//ex.getStackTrace();

throw new RuntimeException ("UUUPS", ex);

}

Average time for invocation: 0.05340


Case 2

catch (Exception ex){

ex.getStackTrace();

//throw new RuntimeException ("UUUPS", ex);

}

Average time for invocation: 0.02640


Case 3

catch (Exception ex){

ex.getStackTrace();

throw new RuntimeException ("UUUPS", ex);

}

Average time for invocation: 0.31630


Conclusion

Exception 처리를 하는 경우 별도의 Exception 위임을 한다거나 StackTrace을 발생하는 것은 큰 성능상 영향이 없을것입니다. 하지만 위 두 가지 모두를 처리 하는 Code가 있다면 지금 당장 수정하십시오.

6 ~ 12배 이상 차이가 발생합니다.



728x90
Comments