자바에는 기본형에 대응하는 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 클래스를 사용해야 한다는 언급이 맞는 것 같다.
'연구' 카테고리의 다른 글
자바(JAVA)로 고정 소숫점 연산과 부동 소숫점 연산 속도 (0) | 2015.07.07 |
---|---|
수학적인 신경망의 뉴런(neuron)에 대한 기술 (1) | 2015.07.03 |
자바에서 단순 배열과 리스트의 요소 접근 속도 비교 (0) | 2015.07.02 |
C++과 JAVA성능 내 윈도 노트북에서의 비교 (0) | 2015.07.01 |
C/C++에서 double형 간 곱셈과 long long형 곱셈 수행 시간 비교 (0) | 2015.06.28 |