블로그 자료를 이전하고 있습니다. 많은방문 부탁드립니다 ( https://hyeonguj.github.io/ )
이 블로그의 자료는 이관된 페이지에서도 보실 수 있습니다.
https://hyeonguj.github.io/2017/01/15/JMH로-자바-성능측정-비교하기-java-performance/
java performance
Map, Set, List, Queue 의 차이점
위 4가지는 Java에서 사용 가능한 Collection이고 데이터를 모아서 사용한다는 점에서 비슷하지만 차이가 있다.
Map
Map<K,V>
key 와 value 쌍으로 이루어져 있어서 두개의 값을 mapping 하는 용도로 많이 사용한다. 쉽게 생각하면 database에 attribute 가 1개밖에 없는 table이다. key 값을 넣으면 value 를 리턴해 준다. 개인적으로 구현체로는 주로 HashMap을 쓰며 , Map<String,String> = new HashMap<>()
처럼 사용
Set,List,Queue
이 3가지를 분리 한 이유는, 이 모두 Map과 다르게 쌍이 아닌 데이터 자체를 모으기 때문이다. 하지만 세부적인 기능은 다르다.
- List
- 순서가 있는 데이터를 저장 할 때 사용
- 같은 값의 데이터가 들어와도 다른 index에 저장이 된다.
- ArrayList, LinkedList..
- Set
- ‘집합’ 이라는 뜻을 가짐
- 중복을 허용하지 않는다, 데이터를 넣을때 이미 같은 값을 저장하고 있는 경우 저장하지 않음
- 출력 할때도 어떤 순서로 출력될지 모른다!
- Queue
- FIFO 이다 (Stack - FILO)
- add, poll 같은 함수를 사용한다
- https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html
참고 - java 에서 제공하는 라이브러리로 자세한 사항은 여기서 확인 할 수 있다
JMH 를 사용하여 Java SE 에 있는 List 를 구현한 클래스들의 추가/조회/삭제 기능의 성능을 비교하시오.
옵션
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
추가
@Benchmark
public void addIntoArrayList() {
List<String> arrayList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
arrayList.add("Hello");
}
}
@Benchmark
public void addIntoLinkedList() {
List<String> linkedList = new LinkedList<>();
for (int i = 0; i < 100; i++) {
linkedList.add("Hello");
}
}
조회(랜덤값)
@Benchmark
public void searchArrayList(State state) {
List<String> arrayList = state.arrayListForSearch;
int number = (int) (arrayList.size()%Math.random());
for (int i = 0; i < 100; i++) {
arrayList.get(number);
}
}
@Benchmark
public void searchLinkedList(State state) {
List<String> linkedList = state.LinkedListForSearch;
int number = (int) (linkedList.size()%Math.random());
for (int i = 0; i < 100; i++) {
linkedList.get(number);
}
}
삭제(랜덤값)
@Benchmark
public void deleteFromArrayList(State state) {
List<String> arrayList = new ArrayList(state.arrayListForSearch) ;
int number = (int) (Math.random()%arrayList.size());
for (int i = 0; i < 10; i++) {
arrayList.remove(number);
}
}
@Benchmark
public void deleteFromLinkedList(State state) {
List<String> linkedList = new ArrayList(state.LinkedListForSearch);
int number = (int) (Math.random()%linkedList.size());
for (int i = 0; i < 10; i++) {
linkedList.remove(number);
}
}
결과
JMH 를 사용하여 Java SE 에 있는 Map을 구현한 클래스들의 추가/조회/삭제 기능의 성능을 비교하시오.
옵션
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
추가
@Benchmark
public void addIntoHashMap() {
Map<String, String> hashMap = new HashMap<>();
for (int i = 0; i < 100; i++) {
hashMap.put(i + "", "Hello");
}
}
@Benchmark
public void addIntoTreeMap() {
Map<String, String> treeMap = new TreeMap<>();
for (int i = 0; i < 100; i++) {
treeMap.put(i + "", "Hello");
}
}
조회(랜덤값)
@Benchmark
public void searchHashMap(State state) {
Map<String, String> hashMap = state.hashMapForSearch;
int number = (int) (Math.random()%hashMap.size());
for (int i = 0; i < 100; i++) {
hashMap.get(number + "");
}
}
@Benchmark
public void searchTreeMap(State state) {
Map<String, String> treeMap = new TreeMap<>();
int number = (int) (Math.random()%treeMap.size());
for (int i = 0; i < 100; i++) {
treeMap.get(number + "");
}
}
삭제(랜덤값)
@Benchmark
public void deleteFromHashMap(State state) {
Map<String, String> hashMap = new TreeMap(state.hashMapForSearch);
int number = (int) (Math.random()%hashMap.size());
for (int i = 0; i < 10; i++) {
hashMap.remove(number + "");
}
}
@Benchmark
public void deleteFromTreeMap(State state) {
Map<String, String> treeMap = new TreeMap(state.TreeMapForSearch);
for (int i = 0; i < 10; i++) {
int number = (int) (Math.random()%treeMap.size());
treeMap.remove(number + "");
}
}
결과
JMH관련
기본적인 사용법 (시작하기)
- 아래와 같은 명령어를 사용해 maven project를 생성한다
$ mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeGroupId=org.openjdk.jmh \ -DarchetypeArtifactId=jmh-java-benchmark-archetype \ -DgroupId=org.sample \ -DartifactId=test \ -Dversion=1.0
- 성능 측정 코드 작성 (위에 있음)
mvn clean install
로 빌드java -jar target/benchmarks.jar
로 성능측정
참고 자료
Java Performance Tuning Guide - http://java-performance.info/jmh/
Code Tools: jmh - http://openjdk.java.net/projects/code-tools/jmh/
자바성능 튜닝 이야기 - 이상민 지음
작성한 코드
'Programming > JAVA' 카테고리의 다른 글
Spring 주기적으로 코드 실행하기 @Schedule (0) | 2017.03.24 |
---|---|
자바 성능 모니터링 도구 (0) | 2017.03.23 |
Maven Profile 를 통해 설정 관리하기 (1) | 2017.03.23 |
spring mvc 에서 unit test 구현 (Controller, Service, DAO) (1) | 2017.03.23 |
토비의 스프링 요약 (ch3 - 템플릿) (2) (0) | 2017.03.23 |