본문으로 바로가기

Arrays.ParallelSort() vs Arrays.Sort()

이번 포스팅은 자바8에서 추가된 병렬 배열 정렬(Parallel array sorting)에 대해서 아주 쉽게 이해 해보고자 한다.

int [] array = new int[10];
// ... 배열값 지정 생략
Arrays.sort(array);
int [] array = new int[10];
// ... 배열값 지정 생략
Arrays.papallelSort(array);

위 두개의 예제 코드는 동일한 결과를 출력한다. 너무나도 당연한 말이다.

 

그렇다면, Java8 에서는왜 같은 기능을 하는 메소드를 추가했을까?

parallelSort() 메소드는 Fork-Join 이라는 프레임웍이 내부적으로 적용된 형태의 메소드이다.

 

 

🗣 Fork-Join이란?

Java7에서 새로 추가된 기능으로, 쉽게말해서 CPU를 더 쉽고 효율적으로 사용하기 위해서 만들어 진 기능이다. Fork : 작업을 여러개로 나누어서 처리한 후 / Join : 합친다. 의 의미다. 이러한 Fork-Join에는 Work Stealing 이라는 개념이 포함되어 있는데, 예를들어 여러개의 Dequeue에 작업이 나뉘어져 어떤 일을 진행할 때, 하나의 Dequeue는 매우 바쁘고, 다른 Dequeue는 매우 한가할 때가 있다. 이 때, 한가한 Dequeue가 바쁜 Dequeue의 대기하고 있는 일을 대신 가져가서 처리해주는 것이라고 이해하면 된다.

즉, parallelSort() 메소드는 필요에 따라 여러 개의 쓰레드로 나뉘어 작업이 수행되기 때문에 정렬되는 속도가 빠르다.

(sort()는 항상 단일 쓰레드로 수행된다.)

 

그렇다고해서 무조건 parallelSort()를 사용하는것은 옳지 않다. 멀티 쓰레드를 사용한다는 것은 그만큼 CPU를 더 많이 사용한다는 뜻이다.

 

실제로 parallelSort()sort()를 비교해보면 약 5000개 정도부터 parallelSort()의 성능이 더 빨라진다고 한다.

 

따라서 데이터의 개수가 많지 않은 배열에서는 굳이 parallelSort()를 사용할 필요가 없다. 상황에 맞게 사용하는 훈련을 하자!


Sort 메소드는 매우 많이 사용해본 메소드인데, 항상 IDE로 자동완성 기능을 사용하다보니 어쩔때는 parallelSort()를 사용하기도 하고 어쩔때는 sort()를 사용하기도 했다. 이제 확실하게 이해했으니, 상황에 맞게 사용해야겠다.😊