csct3434
[자바 성능 튜닝 이야기] 04. Collection 성능 비교 본문
Collection 및 Map 인터페이스 구성
Set 인터페이스
- HashSet : 데이터를 해쉬 테이블에 담는 클래스로 순서 없이 저장된다.
- LinkedHashSet : 데이터를 해쉬 테이블에 담는 클래스로 저장된 순서에 따라서 순서가 결정된다.
- TreeSet : 데이터를 Red-Black 트리에 담는 클래스로 내부적으로 정렬이 수행된다.
데이터 추가 성능 비교 : "data1", "data2", ... , "data1000" 순차 추가
대상 | 평균 응답 시간 (마이크로초) |
HashSet | 375 |
LinkedHashSet | 378 |
TreeSet | 1,249 |
- HashSet과 LinkdHashSet의 성능은 비슷하고, TreeSet은 내부적으로 정렬이 수행되어 상대적으로 느린 성능을 보인다.
HashSet의 크기를 미리 지정한 경우
대상 | 평균 응답 시간 (마이크로초) |
HashSet | 375 |
HashSetWithInitialSize | 352 |
- 데이터의 크기를 알고 있는 경우, 초기 크기를 지정하는 것이 성능상 유리하다.
데이터 읽기 성능 비교 : Iterator를 통한 순회
대상 | 평균 응답 시간 (마이크로초) |
HashSet | 26 |
LinkedHashSet | 16 |
TreeSet | 35 |
- LinkedHashSet이 가장 빠르고, HashSet, TreeSet 순으로 빠르다.
데이터 읽기 성능 비교 : 랜덤 액세스 (contains)
대상 | 평균 응답 시간 (마이크로초) |
HashSet | 32 |
LinkedHashSet | 32 |
TreeSet | 841 |
- HashSet과 LinkdHashSet의 성능은 비슷하고, TreeSet은 트리 탐색으로 인해 느린 성능을 보인다.
정리
- 데이터를 순서에 따라 탐색하는 작업이 필요한 경우 TreeSet을 사용하고, 그럴 필요가 없는 경우 HashSet이나 LinkedHashSet을 사용하는 것이 좋다.
List 인터페이스
- Vector : 객체 생성시에 크기를 지정할 필요가 없는 배열 클래스로 내부적으로 동기화 처리가 되어있다.
- ArrayList : Vector와 비슷하지만 동기화 처리가 되어 있지 않다.
- LinkedList : ArrayList와 동일하지만, Queue 인터페이스의 구현체로 FIFO 큐 작업을 수행한다.
데이터 추가 성능 비교 : 1, 2, ... , 1000 순차 추가
대상 | 평균 응답 시간 (마이크로초) |
Vector | 28 |
ArrayList | 31 |
LinkedList | 40 |
- 클래스 간에 큰 차이가 없는 것을 볼 수 있다.
데이터 읽기 성능 비교 : get() 메서드를 통한 순회
대상 | 평균 응답 시간 (마이크로초) |
Vector | 105 |
ArrayList | 4 |
LinkedList | 1,512 |
- ArrayList의 속도가 가장 빠르고, Vector와 LinkedList는 속도가 매우 느리다.
- Vector가 느린 이유는 get() 메서드에 synchronized가 선언되어 있기 때문이다.
- LinkedList가 느린 이유는 Queue 인터페이스의 구현체이기 때문이다.
데이터 삭제 성능 비교 : remove() 메서드 호출
대상 | 평균 응답 시간 (마이크로초) |
VectorFirst | 687 |
VectorLast | 426 |
ArrayListFirst | 418 |
ArrayListLast | 146 |
LinkedListFirst | 423 |
LinkedListFirst | 407 |
- Vector와 ArrayList의 경우 첫번째 값과 마지막 값을 삭제하는 속도에 차이가 큰 반면, LinkedList는 별 차이가 없다.
- 속도 차이의 원인은 Vector와 ArrayList가 내부적으로 배열을 사용하기 때문에, 데이터를 삭제하면 그 뒤의 데이터들을 앞으로 한 칸씩 옮기는 작업을 수행하기 때문이다.
Queue 인터페이스
- java.util : 일반적인 목적의 큐 클래스(LinkedList, PriorityQueue)
- java.util.concurrent : 동기화 처리가 되어있는 큐 클래스(LinkedBlockingQueue, ArrayBlockingQueue, PriorityBlockingQueue, DelayQueue, SynchronousQueue)
Map 인터페이스
- Hashtable : 데이터를 해쉬 테이블에 담는 클래스로 내부적으로 동기화 처리가 되어있다.
- HashMap : Hashtable과 비슷하지만, null 값을 허용하고 동기화 처리가 되어있지 않다.
- LinkedHashMap : HashMap과 거의 동일하며 이중 연결리스트로 구현되어 있다는 점만 다르다.
- TreeMap : Red-Black 트리에 데이터를 담는 클래스로 키에 의해 순서가 결정된다.
데이터 읽기 성능 비교 : get() 메서드를 통한 순회
대상 | 평균 응답 시간 (마이크로초) |
Hashtable | 106 |
HashMap | 32 |
LinkedHashMap | 34 |
TreeMap | 197 |
데이터 읽기 성능 비교 : 랜덤 액세스 (get)
대상 | 평균 응답 시간 (마이크로초) |
Hashtable | 120 |
HashMap | 40 |
LinkedHashMap | 46 |
TreeMap | 277 |
- HashMap과 LinkedHashMap의 성능은 비슷하고, Hashtable과 TreeMap은 상대적으로 느린 성능을 보인다.
- Hashtable이 느린 이유는 내부적으로 syncrhonized가 선언되어 있기 때문이다.
- TreeMap이 느린 이유는 트리 형태로 데이터를 탐색하기 때문이다.
정리
인터페이스 | 클래스 |
Set | HashSet |
List | ArrayList |
Map | HashMap |
Queue | LinkedList |
- Sun에서 발표한 자료에 따르면, 각 인터페이스 별로 가장 일반적으로 사용되는 클래스는 위와 같다.
- 일반적인 웹을 개발할 때는 Collection 별 성능 차이를 비교하는 것에 큰 의미가 없다.
- 각 클래스마다 사용 목적이 다르기 때문에, 이를 고려하여 상황에 가장 부합하는 클래스를 선택하는 것이 중요하다.
'개발 서적 > 자바 성능 튜닝 이야기' 카테고리의 다른 글
[자바 성능 튜닝 이야기] 08. synchronized (0) | 2024.05.06 |
---|---|
[자바 성능 튜닝 이야기] 06~07. static, reflection (0) | 2024.05.05 |
[자바 성능 튜닝 이야기] 05. 조건문과 반복문의 성능 (0) | 2024.05.05 |
[자바 성능 튜닝 이야기] 03. String vs StringBuffer vs StringBuilder (0) | 2024.04.28 |
[자바 성능 튜닝 이야기] 02. 내가 만든 프로그램의 속도를 알고 싶다 (0) | 2024.04.28 |