Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

csct3434

[자바 성능 튜닝 이야기] 04. Collection 성능 비교 본문

개발 서적/자바 성능 튜닝 이야기

[자바 성능 튜닝 이야기] 04. Collection 성능 비교

csct3434 2024. 4. 28. 23:31

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 별 성능 차이를 비교하는 것에 큰 의미가 없다.
  • 각 클래스마다 사용 목적이 다르기 때문에, 이를 고려하여 상황에 가장 부합하는 클래스를 선택하는 것이 중요하다.