Kotlin 예외 처리 성능 비교: Either vs Try-catch

Aryumka·2025년 3월 30일

Kotlin에서 예외를 처리하는 대표적인 두 가지 방식인

  • 전통적인 Try-catch
  • 함수형 스타일의 Either 방식

각각의 성능을 JMH 벤치마크를 통해 비교

실험 목적

  • Throwable 예외를 던지는 방식(try-catch)과, Stacktrace 없이 메시지만 담은 가벼운 객체(Either + value class)를 반환하는 방식의 성능 차이를 측정

실험 환경

  • 언어: Kotlin
  • 벤치마크 도구: JMH (Java Microbenchmark Harness)
  • 모드: Throughput(초당 연산 횟수)
  • JVM: Java 17, Kotlin 1.9.x
  • 오류 발생 확률: 10%

실험 코드 요약

@State(Scope.Thread)
open class TryVsEitherBenchmark {

  private val random = Random(1234)
  private val errorProbability = 0.1
  private lateinit var errorScenarios: BooleanArray
  private var index = 0

  @Setup
  fun setup() {
    errorScenarios = BooleanArray(10_000) { random.nextDouble() < errorProbability }
  }

  private fun nextScenario(): Boolean = errorScenarios[index++ % errorScenarios.size]

  @Benchmark
  fun eitherMixed(): Either<CustomError, Int> =
    if (nextScenario()) Either.Left(CustomError("fail")) else Either.Right(1 + 1)

  @Benchmark
  fun tryCatchMixed(): Int = try {
    if (nextScenario()) throw RuntimeException("fail")
    1 + 1
  } catch (e: Exception) {
    -1
  }

  @Benchmark
  fun plain(): Int = 1 + 1
}

@JvmInline
value class CustomError(val message: String)

실험 결과

벤치마크 방식초당 연산 횟수 (ops/s)기준(plain) 대비 성능
plain (기준)3,502,444,726 ops/s100%
eitherMixed (Either)324,691,946 ops/s9.3% (약 10배 느림)
tryCatchMixed (try-catch)16,596,634 ops/s0.47% (약 210배 느림)

결과 분석

  • Either 방식은 Throwable이 없고, Stacktrace도 생성하지 않으므로 성능이 뛰어남.
  • Try-catch 방식은 Throwable 및 Stacktrace의 오버헤드로 인해 크게 성능이 저하. 자주 예외가 던져지는 환경에서는 JIT 컴파일러가 최적화를 포기. (jitwatch 로그 분석 결과 JVM Inline도 되지 않음)

결론 및 권장사항

  • 빈번한 예외 상황에서 Throwable 기반 예외 던지기는 큰 성능 저하를 야기
  • 함수형 스타일(Either + value class)의 예외 처리는 성능이 뛰어나며 유지보수성과 가독성 측면에서도 좋음
  • 성능이 중요한 애플리케이션이나 라이브러리 개발에서는 Either와 같은 경량 에러 객체 반환 방식 도입 권장
profile
아륨까라고 읽습니다.

0개의 댓글