시작하기에 앞서

Coroutine 과 Dispatcher 매우 간략하게..

CPU Bound Test (vs Coroutine)

핵심 요약

테스트 환경

맥북 M1 PRO (10 core 16 ram)

OS - MacOS Sequoia 15.5

CPU Bound 테스트를 위해 소수 찾기 알고리즘으로 10만회씩 진행

// 테스트 코드 일부 (Virtual Thread)
class VirtualThreadTest {
    @Test
    fun `CPU-BOUND TEST VT`() {
        val executor = Executors.newVirtualThreadPerTaskExecutor()

        MeasureUtils.measure {
            val jobs = List(100_000) {  // 10만회 실시
                executor.submit { FindPrime.execute(10_000) }  // 1만 이하의 소수 찾기
            }
            jobs.forEach { it.get() }
        }

        executor.shutdown()
    }
}

결과 요약 (4회 평균)

각 모델별 4회차 평균 결과

<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" />

CPU TIME : 실제 CPU 연산이 일어난 시간

Memory Usage : 테스트 시작 전후의 사용중인 힙 메모리 차

Heap Used after GC : 테스트 종료 후 GC로 회수되지 않고 남아있는 객체

(참고) Coroutine(FixedThreadPool) 의 스레드 개수는 **core 수 + 1**로 지정

</aside>

실행 모델 총 실행 시간 CPU Time Memory Usage Heap Used after GC
Platform Thread 1069.8 ms 31.7 ms 9.9 MB 7.9 MB
Virtual Thread 1133.6 ms 93.6 ms 34.7 MB 11.1 MB
Coroutine
(Dispatchers.Default) 1191.3 ms 176.9 ms 48.2 MB 19.1 MB
Coroutine
(FixedThreadPool) 1128.8 ms 133.4 ms 38.6 MB 18.0 MB
Coroutine
(Virtual Thread) 1206.5 ms 206.3 ms 73.4 MB 19.4 MB