티스토리 뷰


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는 표준편차를 말한다. 그러므로 이와 같은 수치를 볼 때는 평균과 표준편차를 중심으로 보면 된다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/11   »
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
글 보관함