PHpullh
학습 라이브러리/Java/JMH — Java 마이크로벤치마크

JAVA · 성능/JVM

JMH — Java 마이크로벤치마크

JMH(Java Microbenchmark Harness)로 신뢰할 수 있는 성능 측정을 합니다.

성능/JVM고급JMHbenchmark@Warmup@Measurement@State

핵심 설명

JMH(Java Microbenchmark Harness)로 신뢰할 수 있는 성능 측정을 합니다.

Java code

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.*;
import java.util.concurrent.TimeUnit;

@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Warmup(iterations = 3, time = 1)
@Measurement(iterations = 5, time = 1)
@Fork(1)
public class StringConcatBenchmark {

    @Param({"10", "100", "1000"})
    int count;

    private String[] words;

    @Setup
    public void setup() {
        words = new String[count];
        for (int i = 0; i < count; i++) {
            words[i] = "word" + i;
        }
    }

    @Benchmark
    public String stringPlus() {
        String result = "";
        for (String w : words) result += w;
        return result;
    }

    @Benchmark
    public String stringBuilder() {
        var sb = new StringBuilder(count * 6);
        for (String w : words) sb.append(w);
        return sb.toString();
    }

    @Benchmark
    public String stringJoin() {
        return String.join("", words);
    }

    @Benchmark
    public String streamCollect() {
        return Arrays.stream(words)
            .collect(java.util.stream.Collectors.joining());
    }

    // 실행 방법:
    // mvn package
    // java -jar target/benchmarks.jar
    // 또는
    // public static void main(String[] args) throws Exception {
    //     new Runner(new OptionsBuilder()
    //         .include(StringConcatBenchmark.class.getSimpleName())
    //         .build()).run();
    // }
}

학습 팁

JVM의 JIT 컴파일러 때문에 단순 루프 타이밍은 신뢰할 수 없습니다. JMH는 워밍업, 데드코드 제거 방지, 통계 처리를 모두 해줍니다.

주의할 점

JMH 없이 System.currentTimeMillis()로 측정하면 JVM JIT 최적화로 결과가 완전히 다를 수 있습니다. 특히 첫 실행과 반복 실행의 차이가 큽니다.

자주 묻는 질문

JMH — Java 마이크로벤치마크란 무엇인가요?

JMH(Java Microbenchmark Harness)로 신뢰할 수 있는 성능 측정을 합니다.

JMH — Java 마이크로벤치마크 학습 시 주의할 점은 무엇인가요?

JMH 없이 System.currentTimeMillis() 로 측정하면 JVM JIT 최적화로 결과가 완전히 다를 수 있습니다. 특히 첫 실행과 반복 실행의 차이가 큽니다.