레이블이 비교인 게시물을 표시합니다. 모든 게시물 표시
레이블이 비교인 게시물을 표시합니다. 모든 게시물 표시

2015년 7월 3일 금요일

자바의 기본형과 wrapper 클래스의 성능 비교

 자바에는 기본형에 대응하는 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 클래스를 사용해야 한다는 언급이 맞는 것 같다.