Add IR specific timing measurements to performance manager
This commit is contained in:
@@ -21,6 +21,9 @@ abstract class CommonCompilerPerformanceManager(private val presentableName: Str
|
|||||||
|
|
||||||
private var startGCData = mutableMapOf<String, GCData>()
|
private var startGCData = mutableMapOf<String, GCData>()
|
||||||
|
|
||||||
|
private var irTranslationStart: Long = 0
|
||||||
|
private var irGenerationStart: Long = 0
|
||||||
|
|
||||||
fun getMeasurementResults(): List<PerformanceMeasurement> = measurements
|
fun getMeasurementResults(): List<PerformanceMeasurement> = measurements
|
||||||
|
|
||||||
fun enableCollectingPerformanceStatistics() {
|
fun enableCollectingPerformanceStatistics() {
|
||||||
@@ -29,6 +32,8 @@ abstract class CommonCompilerPerformanceManager(private val presentableName: Str
|
|||||||
ManagementFactory.getGarbageCollectorMXBeans().associateTo(startGCData) { it.name to GCData(it) }
|
ManagementFactory.getGarbageCollectorMXBeans().associateTo(startGCData) { it.name to GCData(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun deltaTime(start: Long): Long = PerformanceCounter.currentTime() - start
|
||||||
|
|
||||||
open fun notifyCompilerInitialized() {
|
open fun notifyCompilerInitialized() {
|
||||||
if (!isEnabled) return
|
if (!isEnabled) return
|
||||||
recordInitializationTime()
|
recordInitializationTime()
|
||||||
@@ -59,6 +64,36 @@ abstract class CommonCompilerPerformanceManager(private val presentableName: Str
|
|||||||
measurements += CodeGenerationMeasurement(files, lines, TimeUnit.NANOSECONDS.toMillis(time), additionalDescription)
|
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) {
|
fun dumpPerformanceReport(destination: File) {
|
||||||
destination.writeBytes(createPerformanceReport())
|
destination.writeBytes(createPerformanceReport())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,3 +48,15 @@ class GarbageCollectionMeasurement(private val garbageCollectionKind: String, pr
|
|||||||
class PerformanceCounterMeasurement(private val counterReport: String) : PerformanceMeasurement {
|
class PerformanceCounterMeasurement(private val counterReport: String) : PerformanceMeasurement {
|
||||||
override fun render(): String = counterReport
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+6
-1
@@ -374,6 +374,7 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
performanceManager?.notifyGenerationStarted()
|
performanceManager?.notifyGenerationStarted()
|
||||||
val signaturer = IdSignatureDescriptor(JvmManglerDesc())
|
val signaturer = IdSignatureDescriptor(JvmManglerDesc())
|
||||||
|
|
||||||
|
performanceManager?.notifyIRTranslationStarted()
|
||||||
val (moduleFragment, symbolTable, sourceManager, components) =
|
val (moduleFragment, symbolTable, sourceManager, components) =
|
||||||
Fir2IrConverter.createModuleFragment(
|
Fir2IrConverter.createModuleFragment(
|
||||||
session, resolveTransformer.scopeSession, firFiles,
|
session, resolveTransformer.scopeSession, firFiles,
|
||||||
@@ -381,6 +382,9 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
generatorExtensions = JvmGeneratorExtensions(),
|
generatorExtensions = JvmGeneratorExtensions(),
|
||||||
mangler = FirJvmKotlinMangler(session)
|
mangler = FirJvmKotlinMangler(session)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
performanceManager?.notifyIRTranslationFinished(ktFiles.size, codeLines, debugTargetDescription)
|
||||||
|
|
||||||
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
|
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext
|
||||||
|
|
||||||
val codegenFactory = JvmIrCodegenFactory(moduleConfiguration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases))
|
val codegenFactory = JvmIrCodegenFactory(moduleConfiguration.get(CLIConfigurationKeys.PHASE_CONFIG) ?: PhaseConfig(jvmPhases))
|
||||||
@@ -402,7 +406,7 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
|
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
||||||
|
|
||||||
|
performanceManager?.notifyIRGenerationStarted()
|
||||||
generationState.beforeCompile()
|
generationState.beforeCompile()
|
||||||
codegenFactory.generateModuleInFrontendIRMode(
|
codegenFactory.generateModuleInFrontendIRMode(
|
||||||
generationState, moduleFragment, symbolTable, sourceManager
|
generationState, moduleFragment, symbolTable, sourceManager
|
||||||
@@ -431,6 +435,7 @@ object KotlinToJVMBytecodeCompiler {
|
|||||||
generationState.extraJvmDiagnosticsTrace.bindingContext, environment.messageCollector
|
generationState.extraJvmDiagnosticsTrace.bindingContext, environment.messageCollector
|
||||||
)
|
)
|
||||||
|
|
||||||
|
performanceManager?.notifyIRGenerationFinished(ktFiles.size, codeLines, additionalDescription = debugTargetDescription)
|
||||||
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
|
||||||
outputs[module] = generationState
|
outputs[module] = generationState
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user