From 9be68d5046d51274df03097d13da524772bb656d Mon Sep 17 00:00:00 2001 From: Sergey Patrikeev Date: Sat, 2 May 2020 19:14:58 +0300 Subject: [PATCH] Indexing time diagnostic: count statistic values (min/max/mean/median), use millis instead of nano in presentations. GitOrigin-RevId: 46a659987dfebe648aac0bc2275230d6fcfc2017 --- .../diagnostic/IndexDiagnosticJson.kt | 127 ++++++++++++------ .../indexing/diagnostic/MaxNTimeBucket.kt | 38 ++++++ .../util/indexing/diagnostic/PerThreadTime.kt | 12 +- 3 files changed, 130 insertions(+), 47 deletions(-) create mode 100644 platform/lang-impl/src/com/intellij/util/indexing/diagnostic/MaxNTimeBucket.kt diff --git a/platform/lang-impl/src/com/intellij/util/indexing/diagnostic/IndexDiagnosticJson.kt b/platform/lang-impl/src/com/intellij/util/indexing/diagnostic/IndexDiagnosticJson.kt index d0bd7d94927c..cdd4ae5a7ec5 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/diagnostic/IndexDiagnosticJson.kt +++ b/platform/lang-impl/src/com/intellij/util/indexing/diagnostic/IndexDiagnosticJson.kt @@ -8,37 +8,70 @@ import java.time.ZoneId import java.time.ZonedDateTime import java.time.format.DateTimeFormatter -data class JsonPerThreadTime( - val perThreadTimes: List, - val totalCpuTime: TimeNano +private fun TimeNano.toMillis(): TimeMillis = this / 1_000_000 + +data class JsonPerThreadTimeStats( + val minTime: TimeMillis, + val maxTime: TimeMillis, + val meanTime: TimeMillis, + val medianTime: TimeMillis ) -fun PerThreadTime.toJsonPerThreadTime(): JsonPerThreadTime = - JsonPerThreadTime( - threadIdToTime.values.sortedDescending(), - threadIdToTime.values.sum() +fun PerThreadTime.toJsonPerThreadTime(): JsonPerThreadTimeStats { + val timeBuckets = threadIdToTimeBucket.values + if (timeBuckets.isEmpty()) { + return JsonPerThreadTimeStats(-1, -1, -1, -1) + } + + val median = getMedianOfArray(timeBuckets.flatMap { it.maxNTimes }) + val min = timeBuckets.map { it.minTime }.min()!! + val max = timeBuckets.map { it.maxTime }.max()!! + val mean = getMeanOfArray(timeBuckets.map { it.meanTime }) + + return JsonPerThreadTimeStats( + min.toMillis(), + max.toMillis(), + mean.toLong().toMillis(), + median.toLong().toMillis() ) +} + +private fun getMeanOfArray(elements: Collection): Double { + require(elements.isNotEmpty()) + return elements.map { it.toDouble() }.sum() / elements.size +} + +private fun getMedianOfArray(elements: Collection): Double { + require(elements.isNotEmpty()) + val sorted = elements.map { it.toDouble() }.sorted() + return if (sorted.size % 2 == 0) { + (sorted[sorted.size / 2] + sorted[sorted.size / 2 - 1]) / 2.0 + } + else { + sorted[sorted.size / 2] + } +} data class JsonFileProviderIndexStatistics( - val indexableFilesProviderDebugName: String, + val providerName: String, // = + +