我有一个返回结果的函数,而且我还在测量该函数的运行时间:
private suspend fun <T> runParallelTasksWithStatistics(
chunksOfParallelTasks: List<List<T>>,
task: suspend (SessionId?, ClientApiRpcProxy, T) -> Unit
): StressTestStatistics {
val testStartTimeMs = System.currentTimeMillis()
val taskResults = runParallelTasks(chunksOfParallelTasks, task)
val totalMillisPassed = System.currentTimeMillis() - testStartTimeMs
return calculateStressTestStatistics(
AggregateTaskResults(taskResults, totalMillisPassed)
)
}
如您所见,在运行函数runParallelTasks(chunksOfParallelTasks, task)
之后,我需要两个值:
totalMillisPassed
taskResults
如何使用measureTimeMillis
而不用修改var
变量?
val totalMillisPassed = measureTimeMillis {
val taskResults = runParallelTasks(chunksOfParallelTasks, task)
}
AggregateTaskResults(taskResults, totalMillisPassed)
在AggregateTaskResults()
范围内,我仅看到totalMillisPassed
,但我也想访问结果taskResults
。
答案 0 :(得分:2)
您可以定义自己的measureTimeMilis
版本,该版本返回时间和:
fun <R> measureTimeMillisWithResult(block: () -> R): Pair<Long, R> {
val start = System.currentTimeMillis()
val result = block()
return Pair(System.currentTimeMillis() - start, result)
}
调用它,您可以利用Pair
可以被解构的事实:
val (time, result) = measureTimeMillisWithResult {
// Calculate the result here.
}
println("Calculation took $time ms")
return result
答案 1 :(得分:2)
Todds答案的替代方法,但仍实现自己的功能:
inline fun <T> measureTimeMillis(handleDuration: (Long) -> Unit = { }, supplier: () -> T): T {
val start = System.currentTimeMillis()
return supplier().also {
handleDuration(System.currentTimeMillis() - start)
}
}
用法如下:
val result = measureTimeMillis {
// your function
}
或者如果您想在持续时间内做其他事情:
val result = measureTimeMillis(::registerDuration) {
// your function
}
val result = measureTimeMillis( { println("Took $it ms") } ) {
// your function
}
为了避免与标准函数混淆,使用其他名称可能会有所帮助。
我为此创建了自己的度量包装类型,以便可以使用默认的度量工具(记录或打印或其他内容)轻松增强某些表达式。如果要测量某项,只需在行的前面或分配之前添加measurer measure
(为此使用infix
),这样就无需处理每次测量返回的毫秒数。 / p>