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