정상적인 로직에 exception을 활용하면 성능이 황이라는건 공부 조금 하면 나오는 이야기다. (하지만 모르는 개발자랑 일 할기회도 있다 ^^)
이론은 잘 모르고 간단한 실험 결과만 보자.
일단 VM정보. 글구 장비는 흰 싸구려 맥북이다.
java version "1.5.0_24"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_24-b02-357-9M3165)
Java HotSpot(TM) Client VM (build 1.5.0_24-149, mixed mode, sharing)
예제는 간단하다. 그냥 object를 100만개 만들고 시간잰다.
JAVA:
-
public class ExceptionTest1 {
-
public static void main
(String...
args) {
-
long before =
System.
currentTimeMillis();
-
for(int i=0;i<1000000;i++) {
-
-
}
-
long after =
System.
currentTimeMillis();
-
System.
out.
println("Diff : "+
(after-before
)/
1000.
0);
-
}
-
}
결과 (단위:초)
Diff : 0.013
이번엔 Object대신 Exception 객체를 만든다.
JAVA:
-
public class ExceptionTest2 {
-
public static void main
(String...
args) {
-
long before =
System.
currentTimeMillis();
-
for(int i=0;i<1000000;i++) {
-
-
}
-
long after =
System.
currentTimeMillis();
-
System.
out.
println("Diff : "+
(after-before
)/
1000.
0);
-
}
-
}
Diff : 1.371
이 예에서는 한 100배 느렸다. 성능저하의 핵심은 Throwable의 생성자에서 fillStackTrace() 호출에 있다.
이 정도도 만족 못하고 더 느리게 만들고 싶으면 I/O를 유발시키면 된다. 흔히 하는 짓이지만 printStackTrace()를 호출을 추가하면 만족할 수 있을것이다.(여기서는 그냥 stderr에 찍도록 코딩되어있고 local ternimal로 출력)
Diff : 49.082
Exception을 생성하기만 하는 예제보다 35배 정도 느려졌다.