PHpullh
학습 라이브러리/Kotlin/벤치마크 (JMH)

KOTLIN · 성능

벤치마크 (JMH)

JMH(Java Microbenchmark Harness)로 정밀한 마이크로벤치마크를 작성합니다. JVM 최적화를 고려한 신뢰할 수 있는 측정입니다.

성능고급jmhbenchmarkmicrobenchmarkwarmup

핵심 설명

JMH(Java Microbenchmark Harness)로 정밀한 마이크로벤치마크를 작성합니다. JVM 최적화를 고려한 신뢰할 수 있는 측정입니다.

Kotlin code

// build.gradle.kts:
// plugins { id("me.champeau.jmh") version "0.7.2" }
// 실제 JMH 벤치마크 예시 (개념 코드)

// @State(Scope.Benchmark)
// @BenchmarkMode(Mode.AverageTime)
// @OutputTimeUnit(TimeUnit.NANOSECONDS)
// @Warmup(iterations = 3, time = 1)
// @Measurement(iterations = 5, time = 1)
open class CollectionBenchmark {
    private val data = (1..10000).toList()

    // @Benchmark
    fun listFilterMap(): List<Int> =
        data.filter { it % 2 == 0 }.map { it * 2 }

    // @Benchmark
    fun sequenceFilterMap(): List<Int> =
        data.asSequence().filter { it % 2 == 0 }.map { it * 2 }.toList()

    // @Benchmark
    fun manualLoop(): List<Int> = buildList {
        for (i in data) if (i % 2 == 0) add(i * 2)
    }
}

// 간이 벤치마크 (JMH 없이)
fun simpleBench(name: String, iterations: Int = 1000, block: () -> Any?) {
    // 워밍업
    repeat(500) { block() }
    // 측정
    val start = System.nanoTime()
    repeat(iterations) { block() }
    val elapsed = (System.nanoTime() - start) / iterations
    println("$name: ${elapsed}ns/op (${elapsed/1000}μs/op)")
}

fun main() {
    val data = (1..10000).toList()
    simpleBench("List chain") { data.filter { it % 2 == 0 }.map { it * 2 } }
    simpleBench("Sequence chain") { data.asSequence().filter { it % 2 == 0 }.map { it * 2 }.toList() }
    simpleBench("Manual loop") { buildList { for (i in data) if (i % 2 == 0) add(i * 2) } }
}

학습 팁

JMH는 dead code elimination, constant folding 등 JVM 최적화를 방지하여 정확한 벤치마크를 보장합니다.

주의할 점

간이 벤치마크는 JVM 최적화로 인해 실제보다 빠르게 측정될 수 있습니다. 정밀한 결과가 필요하면 반드시 JMH를 사용하세요.

자주 묻는 질문

벤치마크 (JMH)란 무엇인가요?

JMH(Java Microbenchmark Harness)로 정밀한 마이크로벤치마크를 작성합니다. JVM 최적화를 고려한 신뢰할 수 있는 측정입니다.

벤치마크 (JMH) 학습 시 주의할 점은 무엇인가요?

간이 벤치마크는 JVM 최적화로 인해 실제보다 빠르게 측정될 수 있습니다. 정밀한 결과가 필요하면 반드시 JMH를 사용하세요.