티스토리 뷰
JMH 설치 및 설정
JMH는 JDK를 오픈소스로 제공하는 OpenJDK에서 만든 성능 측정용 라이브러리이다.
JMH는 Mercurial이라는 코드 저장소를 사용하기 때문에 Mercurial을 설치해야만 한다. 하단의 URL에 접속하여 각 OS 별 다운로드를 통해 설치한다.
https://www.mercurial-scm.org/downloads
정상적으로 설치했다면 원하는 디렉토리에서 다음 명령어를 실행한다.
$ hg clone http://hg.openjdk.java.net/code-tools/jmh/ jmh
코드 다운로드가 완료되면 다음 명령어를 실행하여 메이븐 빌드를 한다.
$ cd jmh $ mvn clean install -DskipTests=true
메이븐 빌드가 완료되었으면 메이블 로컬 저장소에 JMH 라이브러리가 등록되어 있을 것이다.
동일 디렉터리에서 벤치마크 프로젝트를 빌드한다.
$ mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeGroupId=org.openjdk.jmh \ -DarchetypeArtifactId=jmh-simple-benchmark-archetype \ -DgroupId=org.jmh \ -DartifactId=jmh-benchmark \ -Dversion=1.0
마지막으로 jmh-benchmark 디렉터리에 있는 것을 빌드 하면 기본적으로 설정은 끝이난다.
$ cd jmh-benchmark $ mvn clean install
JMH 성능 측정
간단한 성능 테스트를 통해 JMH 결과를 알아보자.
package org.jmh; import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; import org.jmh.DummyData; @BenchmarkMode({Mode.AverageTime}) @OutputTimeUnit(TimeUnit.MILLISECONDS) public class CompareTimerJMH { @Benchmark public DummyData makeObjects() { HashMap<String, String> map = new HashMap<String, String>(1000000); ArrayList<String> list = new ArrayList<String>(1000000); return new DummyData(map, list); } public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(CompareTimerJMH.class.getSimpleName()) .forks(1) .build(); new Runner(opt).run(); } }
package org.jmh; import java.util.ArrayList; import java.util.HashMap; public class DummyData { HashMap<String, String> map; ArrayList<String> list; public DummyData(HashMap<String, String> map, ArrayList<String> list) { this.map = map; this.list = list; } }
@Benchmark라는 어노테이션을 메서드에 선언하면 JMH에서 측정 대상 코드라고 인식한다.
(구버전 일경우 @GenerateMicroBenchmark)
- 하나의 클래스에 여러 개의 메서드가 존재할 수 있다.
- 어노테이션을 선언한 메서드가 끝나지 않으면 측정도 끝나지 않는다.
- 예외가 발생할 경우 해당 메서드의 측정을 종료하고, 다음 측정 메서드로 이동한다.
위 코드 중 makeObjects 함수에서 HashMap, ArrayList를 각각 1000000 사이즈로 DummyData를 만들고 있다.
JMH 실행방법은 아래와 같다.
$ mvn clean install $ java -jar target/benchmarks.jar
그러면 JMH 실행 결과를 보자.
JMH는 여러 개의 스레드로 테스트도 가능하고, 워밍업 작업도 자동으로 수행해주기 때문에 정확한 측정이 가능하다. 여러 결과를 제공하지만, 주목해야 할 부분은 형광색으로 강조한 부분이다.
min은 최소, avg는 평균, max는 최대 값을 의미한다. 그리고 stdev는 표준편차를 말한다. 그러므로 이와 같은 수치를 볼 때는 평균과 표준편차를 중심으로 보면 된다.
'엔지니어링 > 성능과 튜닝' 카테고리의 다른 글
[성능과 튜닝] JAVA 메모리 관리 GC 방식 (0) | 2019.06.04 |
---|---|
[성능과 튜닝] JAVA 메모리 관리 (스택&힙) (0) | 2019.05.31 |
[성능과 튜닝] JAVA 메모리 관리 GC 기본 (0) | 2019.05.28 |
[성능과 튜닝] 프로그램 성능 분석 (0) | 2019.02.22 |
- SQL
- 제주도 3박4일 일정
- spring
- React
- 오라클 내장 함수
- Collection
- 회고
- 리액트
- effective java
- 경력관리
- 정렬 알고리즘
- 소프트웨어공학
- sort algorithm
- 자바
- 리눅스 명령어
- Maven
- 오라클
- 프로그래머스
- 성능분석
- Tomcat
- javascript
- 개발환경
- 제주도 여행
- 자바스크립트
- 프로그래머
- Eclipse
- 리액트 16
- Linux 명령어
- 이직
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |