자바에는 기본형에 대응하는 wrapper 클래스가 있다. 예를 들면 int 는 Interger, double은 Double 이다. 제네릭 클래스에는 기본형을 사용할 수 없으므로 이 wrapper 클래스를 사용해야 한다.
그런데 기본형과 wrapper클래스의 성능 차이가 궁금해서 다음과 같은 간단한 프로그래으로 시험해 보았다.
package wrappertest01;
public class WrapperTest01 { public static long iter = 1000000L; public static int id; public static double db, dSum; public static long le, ls;
public static Double[] dArr; public static double[] darr;
public static void main(String[] args) { dArr = new Double[100]; for(int k=0;k<100;k++) dArr[k]=new Double(1.0); darr = new double[100]; //for(int k=0;k<100;k++) dArr[k]=new Double(1.0);
lst = new ArrayList<>(); for(int k=0;k<100;k++) lst.add(new Double(1.0));
doIt(); doIt(); doIt(); } public static void doIt() { double dSum1 =0, dSum2=0; long id; for(int n=0;n<10;n++) { ls = System.nanoTime(); for(int k=0;k<iter;k++) for(int x=0;x<100;x++) { db=dArr[x]; dArr[x]=db; } le = System.nanoTime(); dSum1 += (le-ls)/1e9;
ls = System.nanoTime(); for(int k=0;k<iter;k++) for(int x=0;x<100;x++) { db=darr[x]; darr[x]=db; } le = System.nanoTime(); dSum2 += (le-ls)/1e9; } System.out.println("Double Arr: "+dSum1/10+ "sec."); System.out.println("double arr: "+dSum2/10+ "sec."); }} |
단순히 배열을 만들어서 배열의 요소를 읽고 쓰는 동작만 1억x100 번을 10번 실행한 평균 시간을 구한 것이다. wrapper클래스가 오버헤드가 있으므로 당연히 다소 느릴거라는 예상 했다. 결과는 기본형의 배열이 훨씬 더 동작이 빠르다는 것이다.
수치상으로는 거의 40배 빠르다. 이 실험만으로 전반적인 성능 비교는 물론 안되겠지만 성능이 중요한 곳에서는 왠만하면 기본형을 사용해야하며 제네릭 클래스를 구현하는 경우와 같이 어쩔 수 없는 경우에만 wrapper 클래스를 사용해야 한다는 언급이 맞는 것 같다.