최근 문제를 풀면서 Sort에 대한 이슈(?) 에 대해 궁금증이 생겨 테스트를 해보았다.
본인은 Sort 사용시 주로 java.util을 이용을 하는데...
여기서 내가 본 코드는 기본적으로 제공된 Arrays나 Collections 모두 Comparator 사용시 Primitive 타입을 사용할수 없다는 점이다.
Example. Arrays.sort
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
그러면 Boxing하는 과정에서 얼마나 리소스를 잡아먹을까 ?
실험 테스트 코드
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
long prevMemory = runtime.freeMemory();
long startTime = System.currentTimeMillis();
int sum = 0;
for (int i = 1; i <= 100_000_00; i++) {
sum += (Integer) i;
}
long endTime = System.currentTimeMillis() - startTime;
long afterMemory = runtime.freeMemory();
System.out.println("Process Time : " + endTime / 1000.0 + " milli seconds");
System.out.println("Total / Used Memory : " + prevMemory + " / " + (prevMemory - afterMemory));
}
테스트 케이스를 진행한 결과 예상과는 좀 다르다.
Time | Memory | |
---|---|---|
Primitive | 0.004 millis | 511544 Bytes |
Wrapper | 0.009 millis | 3642888 Bytes |
천 만건 정도의 케이스에도 시간적으로는 크게 차이가 없는 느낌.
그래도 메모리 사용량에서는 차이가 좀 있는 편이다.
Integer 와 같은 테스트 케이스를 가지고 실행.
Time | Memory | |
---|---|---|
Primitive | 0.029 millis | 511544 Bytes |
Wrapper | 0.033 millis | 5203024 Bytes |
Integer와 비슷하게 시간적 차이는 그다지 크지 않지만
메모리 사용량이 높게 형성되었다.
시간적인 차이보다는 메모리 사용량이 문제가 될 수 있겠다.