From bf1c3777abfe0264dc710c2ffc112d3644e637d2 Mon Sep 17 00:00:00 2001 From: "simon.ogorodnik" Date: Mon, 29 Jun 2020 23:08:08 +0300 Subject: [PATCH] Add IR specific timing measurements to performance manager --- .../CommonCompilerPerformanceManager.kt | 35 +++++++++++++++++++ .../cli/common/performanceMeasurements.kt | 12 +++++++ .../compiler/KotlinToJVMBytecodeCompiler.kt | 7 +++- 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CommonCompilerPerformanceManager.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CommonCompilerPerformanceManager.kt index 7d744a8018a..30503a03dea 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CommonCompilerPerformanceManager.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CommonCompilerPerformanceManager.kt @@ -21,6 +21,9 @@ abstract class CommonCompilerPerformanceManager(private val presentableName: Str private var startGCData = mutableMapOf() + private var irTranslationStart: Long = 0 + private var irGenerationStart: Long = 0 + fun getMeasurementResults(): List = measurements fun enableCollectingPerformanceStatistics() { @@ -29,6 +32,8 @@ abstract class CommonCompilerPerformanceManager(private val presentableName: Str ManagementFactory.getGarbageCollectorMXBeans().associateTo(startGCData) { it.name to GCData(it) } } + private fun deltaTime(start: Long): Long = PerformanceCounter.currentTime() - start + open fun notifyCompilerInitialized() { if (!isEnabled) return recordInitializationTime() @@ -59,6 +64,36 @@ abstract class CommonCompilerPerformanceManager(private val presentableName: Str measurements += CodeGenerationMeasurement(files, lines, TimeUnit.NANOSECONDS.toMillis(time), additionalDescription) } + open fun notifyIRTranslationStarted() { + irTranslationStart = PerformanceCounter.currentTime() + } + + open fun notifyIRTranslationFinished(files: Int, lines: Int, additionalDescription: String?) { + val time = deltaTime(irTranslationStart) + measurements += IRMeasurement( + files, + lines, + TimeUnit.NANOSECONDS.toMillis(time), + additionalDescription, + IRMeasurement.Kind.Translation + ) + } + + open fun notifyIRGenerationStarted() { + irGenerationStart = PerformanceCounter.currentTime() + } + + open fun notifyIRGenerationFinished(files: Int, lines: Int, additionalDescription: String) { + val time = deltaTime(irGenerationStart) + measurements += IRMeasurement( + files, + lines, + TimeUnit.NANOSECONDS.toMillis(time), + additionalDescription, + IRMeasurement.Kind.Generation + ) + } + fun dumpPerformanceReport(destination: File) { destination.writeBytes(createPerformanceReport()) } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/performanceMeasurements.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/performanceMeasurements.kt index 5ea99135d93..069635229c2 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/performanceMeasurements.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/performanceMeasurements.kt @@ -48,3 +48,15 @@ class GarbageCollectionMeasurement(private val garbageCollectionKind: String, pr class PerformanceCounterMeasurement(private val counterReport: String) : PerformanceMeasurement { override fun render(): String = counterReport } + +class IRMeasurement(val files: Int, val lines: Int, val milliseconds: Long, private val description: String?, val kind: Kind) : + PerformanceMeasurement { + + val lps: Double = lines.toDouble() * 1000 / milliseconds + override fun render(): String = + "IR: $kind $files files ($lines lines) ${description ?: ""}in $milliseconds ms - ${"%.3f".format(lps)} loc/s" + + enum class Kind { + Generation, Translation + } +} diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt index 9cc23e753e0..098ebeb328d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt @@ -374,6 +374,7 @@ object KotlinToJVMBytecodeCompiler { performanceManager?.notifyGenerationStarted() val signaturer = IdSignatureDescriptor(JvmManglerDesc()) + performanceManager?.notifyIRTranslationStarted() val (moduleFragment, symbolTable, sourceManager, components) = Fir2IrConverter.createModuleFragment( session, resolveTransformer.scopeSession, firFiles, @@ -381,6 +382,9 @@ object KotlinToJVMBytecodeCompiler { generatorExtensions = JvmGeneratorExtensions(), mangler = FirJvmKotlinMangler(session) ) + + performanceManager?.notifyIRTranslationFinished(ktFiles.size, codeLines, debugTargetDescription) + val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext val codegenFactory = JvmIrCodegenFactory(moduleConfiguration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases)) @@ -402,7 +406,7 @@ object KotlinToJVMBytecodeCompiler { ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() - + performanceManager?.notifyIRGenerationStarted() generationState.beforeCompile() codegenFactory.generateModuleInFrontendIRMode( generationState, moduleFragment, symbolTable, sourceManager @@ -431,6 +435,7 @@ object KotlinToJVMBytecodeCompiler { generationState.extraJvmDiagnosticsTrace.bindingContext, environment.messageCollector ) + performanceManager?.notifyIRGenerationFinished(ktFiles.size, codeLines, additionalDescription = debugTargetDescription) ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() outputs[module] = generationState }