2011년 6월 13일 월요일

The Cost of an Exception

원문: 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배 이상 차이가 발생합니다.

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...