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