Profiler

class Profiler(autoDumpStats: Boolean = false, dumpIntervalMs: Long = 3000)

Простой профайлер для замеров времени выполнения блоков кода. Подходит для замеров часто повторяющихся операций - может посчитать среднее время выполнения, максимальное время, 90, 95, 99 перцентили времени выполнения.

Каждый инстанс Profiler ведет свою статистику по точкам замеров. Точки замеров могут быть вложенными, вложенность определяется автоматически.

Пример использования:

val profiler = Profiler()
while (true) {
if (System.currentTimeMillis() - lastStatDumpTime 3000L) {
lastStatDumpTime = System.currentTimeMillis()
logger.info { profiler.getCurrentStats() }
}

val s1 = profiler.start("Main ingestion loop")
val s2 = profiler.start("Channel receive")
val incoming = channel.receive()
profiler.stop(s2)

val s3 = profiler.start("Group values")
val groupedValues = groupValues(incoming)
profiler.stop(s3)

groupedValues.forEach { groupValues ->
val s4 = profiler.start("Process values")
val valueData = processValues(groupValues)
profiler.stop(s4)

val s5 = profiler.start("Send to buffer")
valueData?.let {
sendToBuffer(wdManager, it)
}
profiler.stop(s5)
}
profiler.stop(s1)
}

В этом примере получим статистику по замерам в логи, причем замеры "Channel receive", "Group values", "Process values" и "Send to buffer" будут вложены в замеры "Main ingestion loop".

Альтернативный способ использования - использовать функции-обертки profile и profileSuspend, которые автоматически производят замеры времени выполнения блока кода:

profiler.profileSuspend("Main ingestion loop") {

val incoming = profiler.profileSuspend("Channel RCV") { channel.receive() }

val groupedValues = profiler.profile("Group values") { groupValues(incoming) }

groupedValues.forEach { groupValues ->
val valueData = profiler.profile("Process values") { processValues(groupValues) }

valueData?.let {
profiler.profile("Send to buffer") { sendToBuffer(wdManager, it) }
}
}

Parameters

autoDumpStats
  • Автоматически писать в логи статистику по замерам по завершении каждого корневого замера, но не чаще, чем раз в dumpInterval миллисекунд. По умолчанию false

dumpIntervalMs
  • Интервал между дампами статистики в миллисекундах. По умолчанию 3000 миллисекунд

Constructors

Link copied to clipboard
constructor(autoDumpStats: Boolean = false, dumpIntervalMs: Long = 3000)

Properties

Link copied to clipboard

Functions

Link copied to clipboard

Возвращает статистику по замерам, отформатированную в строку

Link copied to clipboard
fun <T> profile(point: String, block: () -> T): T

Выполняет замер времени выполнения блока кода и возвращает результат

Link copied to clipboard
suspend fun <T> profileSuspend(point: String, block: suspend () -> T): T

Вызывает замер времени выполнения блока кода в корутине

Link copied to clipboard

Начинает замер времени выполнения блока кода

Link copied to clipboard
fun stop(sessionId: MeasurementId)

Завершает замер времени выполнения блока кода