[Kotlin] 실행 시간 리턴하기

sundays·2023년 3월 14일
0

앞으로 디버그로 실행 시간을 출력하는데 사용하기 위해 작업의 실행 시간을 리턴하는 방법을 알아보려고 합니다

measureTimeMillis

import kotlin.system.measureTimeMillis

이전에 제가 잠시 비동기 사용법을 설명할때 썼던 API 입니다. 이 API 는 주어진 내용을 블록하고 종료 시간을 long 형의 milliseconds로 리턴하고 있습니다.

//Executes the given block and returns elapsed time in milliseconds.
public inline fun measureTimeMillis(block: () -> Unit): Long {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    val start = System.currentTimeMillis()
    block()
    return System.currentTimeMillis() - start
}

예시

import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

fun main() = runBlocking {
    val time = measureTimeMillis {
        longOperating()
    }
    println("It took $time")
}

fun longOperating(): String {
    repeat(2_000_000) {
        print('.')
    }
    return "DONE"
}

실행 결과

....(생략).................It took 7090

measureTimedValue

상위의 measureTimeMillis 의 단점은 리턴되는 값을 받아오지 못한다는 것이 가장 큰 단점이었습니다. 이것의 단점을 보안한 것이 바로 measureTimedValue 입니다

// Executes the given 
// function block and returns an instance of TimedValue class, 
// containing both the result of the function execution 
// and the duration of elapsed time interval.
// The elapsed time is measured with TimeSource.Monotonic.
@SinceKotlin("1.3")
@ExperimentalTime
public inline fun <T> measureTimedValue(block: () -> T): TimedValue<T> {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }

    return TimeSource.Monotonic.measureTimedValue(block)
}

다만 이 API는 실험적 API로 향후 버전의 Kotlin에서 변경 될 수 있습니다.

예시

import kotlin.time.ExperimentalTime
import kotlin.time.measureTimedValue

@OptIn(ExperimentalTime::class)
fun main() {
    val (value , time) = measureTimedValue { longOperating() }
    println("It took $time to calculate $value")
}

fun longOperating(): String {
    repeat(2_000_000) {
        print('.')
    }
    return "DONE"
}

실행결과

.....(생략)............It took 8.977010400s to calculate DONE

Reference

profile
develop life

0개의 댓글