Java 실험 | Comparator & Auto Boxing

YounJM·2023년 4월 21일
0

Java

목록 보기
1/1
post-thumbnail

Summary

최근 문제를 풀면서 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하는 과정에서 얼마나 리소스를 잡아먹을까 ?


Case 1. Integer 변환

실험 테스트 코드

    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

천 만건 정도의 케이스에도 시간적으로는 크게 차이가 없는 느낌.
그래도 메모리 사용량에서는 차이가 좀 있는 편이다.


Case 2. Double 변환

Integer 와 같은 테스트 케이스를 가지고 실행.

Time Memory
Primitive 0.029 millis 511544 Bytes
Wrapper 0.033 millis 5203024 Bytes

Integer와 비슷하게 시간적 차이는 그다지 크지 않지만
메모리 사용량이 높게 형성되었다.


결론

시간적인 차이보다는 메모리 사용량이 문제가 될 수 있겠다.

profile
코드깎는 사람

0개의 댓글