[Commonizer] Replace ResettableClockMark by TimeSource.Monotonic

This commit is contained in:
Dmitriy Dolovov
2023-08-07 23:12:42 +02:00
committed by Space Team
parent 09f895efe6
commit 3b626ea97c
2 changed files with 19 additions and 59 deletions
@@ -7,23 +7,38 @@ package org.jetbrains.kotlin.commonizer.utils
import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.util.Logger
import kotlin.time.Duration
import kotlin.time.TimeSource
private const val ansiReset = "\u001B[0m"
private const val ansiTimeColor = "\u001B[36m"
private const val ansiTargetColor = "\u001B[32m"
internal inline fun <T> Logger?.progress(message: String, action: () -> T): T {
val clock = ResettableClockMark()
clock.reset()
if (this == null)
return action()
val timeMark = TimeSource.Monotonic.markNow()
try {
return action()
} finally {
this?.log("$message ${ansiTimeColor}in ${clock.elapsedSinceLast()}$ansiReset")
val duration = timeMark.elapsedNow().toPrettyString()
log("$message ${ansiTimeColor}in $duration$ansiReset")
}
}
internal inline fun <T> Logger?.progress(
target: CommonizerTarget, message: String, action: () -> T
target: CommonizerTarget, message: String, action: () -> T,
): T {
return progress("[$ansiTargetColor$target$ansiReset]: $message", action)
}
private fun Duration.toPrettyString() = buildString {
toComponents { hours, minutes, seconds, nanos ->
// human-friendly formatted duration
if (hours > 0) append(hours).append("h ")
if (minutes > 0 || isNotEmpty()) append(minutes).append("m ")
if (seconds > 0 || isNotEmpty()) append(seconds).append("s ")
append(nanos / 1000_000).append("ms")
}
}
@@ -1,55 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.commonizer.utils
import java.lang.System.currentTimeMillis
internal class ResettableClockMark {
internal class Period(val start: Long, val end: Long) {
override fun toString(): String {
var remainder = end - start
val millis = remainder % 1000
remainder /= 1000
val seconds = remainder % 60
remainder /= 60
val minutes = remainder % 60
val hours = remainder / 60
// human-friendly formatted duration
return buildString {
if (hours > 0) append(hours).append("h ")
if (minutes > 0 || isNotEmpty()) append(minutes).append("m ")
if (seconds > 0 || isNotEmpty()) append(seconds).append("s ")
append(millis).append("ms")
}
}
}
private var startMark: Long = 0
private var lastMark: Long = 0
fun elapsedSinceLast(): Period = Period(lastMark, currentTimeMillis()).also { lastMark = it.end }
fun elapsedSinceStart(): Period = Period(startMark, currentTimeMillis())
fun reset() {
startMark = currentTimeMillis()
lastMark = startMark
}
}
// TODO: this is how it should be when Kotlin Time will become non-experimental
//@ExperimentalTime
//internal class ResettableClockMark {
// private val startMark = MonoClock.markNow()
// private var lastMark = startMark
//
// fun elapsedSinceLast(): Duration = lastMark.elapsedNow().also { lastMark = lastMark.plus(it) }
// fun elapsedSinceStart(): Duration = startMark.elapsedNow()
//}