in reactor/Core/src/jetbrains/mps/logic/reactor/util/Profiler.kt [57:88]
fun formattedData(): Map<String, String> {
val name2data = rawProfilingData().entries.toMutableList()
val sum = name2data.asSequence().fold(0L) { acc, e -> acc + e.value.dur }
var toReport = (sum * 0.98).toLong()
// sort in-pace descending
Collections.sort(name2data, Comparator.comparingLong<Map.Entry<String, DurFreq>?>({it.value.dur}).reversed())
val result = LinkedHashMap<String, String>()
name2data.asSequence()
.takeWhile { (_, data) -> toReport > 0 && data.dur > 10000 }
.forEach { (name, data) ->
toReport -= data.dur
val parentName2Dur = data.parentDurs.entries.toMutableList()
val parentsTotal = parentName2Dur.fold(0L) { acc, e -> acc + e.value }
var parentsToReport = (parentsTotal * 0.98).toLong()
//sort in-place descending
Collections.sort(parentName2Dur, Comparator.comparingLong<MutableMap.MutableEntry<String, Long>?>({it.value}).reversed())
val sb = StringBuilder("[time: %1\$Ts.%1\$TLs count: %2\$d]".format(millis(data.dur), data.freq))
parentName2Dur
.asSequence()
.takeWhile { (_, dur) -> parentsToReport > 0 && dur > 10000 }
.forEach { (parentName, dur) ->
parentsToReport -= dur
sb.append("\n \\-- ${parentName}")
.append(" [time: %1\$Ts.%1\$TLs".format(millis(dur)))
.append(" count: %1\$d]".format(data.parentFreqs[parentName] ?: 0)) }
result.put(name, sb.toString())
}
return result
}