From 911dfde0fe68550474eb5bf71597a3398c0acfbb Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Sat, 2 May 2020 23:12:36 +0200 Subject: [PATCH] Add highlighting perf test with empty profile --- .../perf/AbstractPerformanceProjectsTest.kt | 99 +++++++++++-------- .../kotlin/idea/perf/PerfTestBuilder.kt | 8 +- .../idea/perf/PerformanceProjectsTest.kt | 18 +++- .../org/jetbrains/kotlin/idea/perf/Stats.kt | 10 +- 4 files changed, 80 insertions(+), 55 deletions(-) diff --git a/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/AbstractPerformanceProjectsTest.kt b/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/AbstractPerformanceProjectsTest.kt index ff19a09404e..f5a066963b7 100644 --- a/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/AbstractPerformanceProjectsTest.kt +++ b/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/AbstractPerformanceProjectsTest.kt @@ -11,6 +11,7 @@ import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl import com.intellij.codeInsight.daemon.impl.HighlightInfo import com.intellij.codeInsight.daemon.impl.IdentifierHighlighterPassFactory import com.intellij.codeInsight.lookup.LookupElement +import com.intellij.codeInspection.InspectionProfileEntry import com.intellij.ide.startup.impl.StartupManagerImpl import com.intellij.openapi.actionSystem.IdeActions import com.intellij.openapi.application.runWriteAction @@ -23,13 +24,11 @@ import com.intellij.openapi.projectRoots.JavaSdk import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl import com.intellij.openapi.startup.StartupManager +import com.intellij.profile.codeInspection.ProjectInspectionProfileManager import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiFile import com.intellij.psi.PsiManager -import com.intellij.testFramework.EditorTestUtil -import com.intellij.testFramework.RunAll -import com.intellij.testFramework.TestDataProvider -import com.intellij.testFramework.UsefulTestCase +import com.intellij.testFramework.* import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl import com.intellij.util.ArrayUtilRt import com.intellij.util.ThrowableRunnable @@ -92,7 +91,7 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { val project = openProject() try { filesToHighlight.forEach { - val perfHighlightFile = perfHighlightFile(project, it, stats, WARM_UP) + val perfHighlightFile = perfHighlightFile(project, it, stats, note = WARM_UP) assertTrue("kotlin project has been not imported properly", perfHighlightFile.isNotEmpty()) } } finally { @@ -319,14 +318,14 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { val editor = fixture.editor val initialText = editor.document.text - updateScriptDependenciesIfNeeded(fileName, fixture, project) + updateScriptDependenciesIfNeeded(fileName, fixture) performanceTest { name("$typeTestPrefix ${notePrefix(note)}$fileName") stats(stats) warmUpIterations(8) iterations(15) - profileEnabled(true) + profilerEnabled(true) setUp { val markerOffset = editor.document.text.indexOf(marker) assertTrue("marker '$marker' not found in $fileName", markerOffset > 0) @@ -404,7 +403,7 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { val editor = fixture.editor val initialText = editor.document.text - updateScriptDependenciesIfNeeded(fileName, fixture, project) + updateScriptDependenciesIfNeeded(fileName, fixture) val tasksIdx = editor.document.text.indexOf(marker) assertTrue("marker '$marker' not found in $fileName", tasksIdx > 0) @@ -444,7 +443,7 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { } commitAllDocuments() } - profileEnabled(true) + profilerEnabled(true) } } @@ -488,7 +487,7 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { val editor = fixture.editor val initialText = editor.document.text - updateScriptDependenciesIfNeeded(fileName, fixture, project) + updateScriptDependenciesIfNeeded(fileName, fixture) val tasksIdx = editor.document.text.indexOf(marker) assertTrue("marker '$marker' not found in $fileName", tasksIdx > 0) @@ -530,7 +529,7 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { } commitAllDocuments() } - profileEnabled(true) + profilerEnabled(true) } } @@ -572,8 +571,8 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { val initialText2 = fixture2.document.text - updateScriptDependenciesIfNeeded(sourceFileName, fixture1, project) - updateScriptDependenciesIfNeeded(sourceFileName, fixture2, project) + updateScriptDependenciesIfNeeded(sourceFileName, fixture1) + updateScriptDependenciesIfNeeded(sourceFileName, fixture2) fixture1.selectMarkers(sourceInitialMarker, sourceFinalMarker) fixture2.selectMarkers(targetInitialMarker, targetFinalMarker) @@ -605,14 +604,13 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { commitAllDocuments() } } - profileEnabled(true) + profilerEnabled(true) } } private fun updateScriptDependenciesIfNeeded( fileName: String, - fixture: Fixture, - project: Project + fixture: Fixture ) { if (isAKotlinScriptFile(fileName)) { runAndMeasure("update script dependencies for $fileName") { @@ -621,39 +619,56 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { } } - protected fun perfHighlightFile(name: String, stats: Stats): List = - perfHighlightFile(project(), name, stats) - protected fun perfHighlightFile( + name: String, + stats: Stats, + tools: Array? = null, + note: String = "" + ): List = perfHighlightFile(project(), name, stats, tools = tools, note = note) + + protected fun perfHighlightFileEmptyProfile(name: String, stats: Stats): List = + perfHighlightFile(project(), name, stats, tools = emptyArray(), note = "empty profile") + + private fun perfHighlightFile( project: Project, fileName: String, stats: Stats, + tools: Array? = null, note: String = "" ): List { - return highlightFile { - val isWarmUp = note == WARM_UP - var highlightInfos: List = emptyList() - performanceTest> { - name("highlighting ${notePrefix(note)}${simpleFilename(fileName)}") - stats(stats) - warmUpIterations(if (isWarmUp) 1 else 3) - iterations(if (isWarmUp) 2 else 10) - setUp { - it.setUpValue = openFileInEditor(project, fileName) + val profileManager = ProjectInspectionProfileManager.getInstance(project) + val currentProfile = profileManager.currentProfile + tools?.let { + configureInspections(it, project, project) + } + try { + return highlightFile { + val isWarmUp = note == WARM_UP + var highlightInfos: List = emptyList() + performanceTest> { + name("highlighting ${notePrefix(note)}${simpleFilename(fileName)}") + stats(stats) + warmUpIterations(if (isWarmUp) 1 else 3) + iterations(if (isWarmUp) 2 else 10) + setUp { + it.setUpValue = openFileInEditor(project, fileName) + } + test { + val file = it.setUpValue + it.value = highlightFile(project, file!!.psiFile) + } + tearDown { + highlightInfos = it.value ?: emptyList() + commitAllDocuments() + FileEditorManager.getInstance(project).closeFile(it.setUpValue!!.psiFile.virtualFile) + PsiManager.getInstance(project).dropPsiCaches() + } + profilerEnabled(!isWarmUp) } - test { - val file = it.setUpValue - it.value = highlightFile(project, file!!.psiFile) - } - tearDown { - highlightInfos = it.value ?: emptyList() - commitAllDocuments() - FileEditorManager.getInstance(project).closeFile(it.setUpValue!!.psiFile.virtualFile) - PsiManager.getInstance(project).dropPsiCaches() - } - profileEnabled(!isWarmUp) + highlightInfos } - highlightInfos + } finally { + profileManager.setCurrentProfile(currentProfile) } } @@ -701,7 +716,7 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { } it.value?.let { v -> assertNotNull(v) } } - profileEnabled(true) + profilerEnabled(true) checkStability(false) } } diff --git a/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/PerfTestBuilder.kt b/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/PerfTestBuilder.kt index 9af4bdf022f..2a291c2cb7e 100644 --- a/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/PerfTestBuilder.kt +++ b/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/PerfTestBuilder.kt @@ -13,7 +13,7 @@ class PerfTestBuilder { private var setUp: (TestData) -> Unit = { } private lateinit var test: (TestData) -> Unit private var tearDown: (TestData) -> Unit = { } - private var profileEnabled: Boolean = false + private var profilerEnabled: Boolean = false private var checkStability: Boolean = true internal fun run() { @@ -24,7 +24,7 @@ class PerfTestBuilder { setUp = setUp, test = test, tearDown = tearDown, - profileEnabled = profileEnabled, + profilerEnabled = profilerEnabled, checkStability = checkStability ) } @@ -57,8 +57,8 @@ class PerfTestBuilder { this.tearDown = tearDown } - fun profileEnabled(profileEnabled: Boolean) { - this.profileEnabled = profileEnabled + fun profilerEnabled(profilerEnabled: Boolean) { + this.profilerEnabled = profilerEnabled } fun checkStability(checkStability: Boolean) { diff --git a/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/PerformanceProjectsTest.kt b/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/PerformanceProjectsTest.kt index 53bafe918c2..945a8449906 100644 --- a/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/PerformanceProjectsTest.kt +++ b/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/PerformanceProjectsTest.kt @@ -77,11 +77,21 @@ class PerformanceProjectsTest : AbstractPerformanceProjectsTest() { stats.use { perfOpenKotlinProject(it) - perfHighlightFile("idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/PsiPrecedences.kt", stats = it) + val filesToHighlight = arrayOf( + "idea/idea-analysis/src/org/jetbrains/kotlin/idea/util/PsiPrecedences.kt", + "compiler/psi/src/org/jetbrains/kotlin/psi/KtElement.kt", + "compiler/psi/src/org/jetbrains/kotlin/psi/KtFile.kt", + "core/builtins/native/kotlin/Primitives.kt", - perfHighlightFile("compiler/psi/src/org/jetbrains/kotlin/psi/KtElement.kt", stats = it) + "compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt", + "compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.kt", - perfHighlightFile("compiler/psi/src/org/jetbrains/kotlin/psi/KtFile.kt", stats = it) + "compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.kt", + "compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.kt" + ) + + filesToHighlight.forEach { file -> perfHighlightFile(file, stats = it) } + filesToHighlight.forEach { file -> perfHighlightFileEmptyProfile(file, stats = it) } perfTypeAndHighlight( it, @@ -282,7 +292,7 @@ class PerformanceProjectsTest : AbstractPerformanceProjectsTest() { setUp(perfKtsFileAnalysisSetUp(project, fileName)) test(perfKtsFileAnalysisTest()) tearDown(perfKtsFileAnalysisTearDown(extraTimingsNs, project)) - profileEnabled(true) + profilerEnabled(true) } extraStats.printWarmUpTimings( diff --git a/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/Stats.kt b/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/Stats.kt index f340ce6c7e0..539efce9e1b 100644 --- a/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/Stats.kt +++ b/idea/performanceTests/test/org/jetbrains/kotlin/idea/perf/Stats.kt @@ -125,7 +125,7 @@ class Stats( setUp: (TestData) -> Unit = { }, test: (TestData) -> Unit, tearDown: (TestData) -> Unit = { }, - profileEnabled: Boolean = false, + profilerEnabled: Boolean = false, checkStability: Boolean = true ) { @@ -135,7 +135,7 @@ class Stats( setUp = setUp, test = test, tearDown = tearDown, - profileEnabled = profileEnabled + profilerEnabled = profilerEnabled ) val mainPhaseData = PhaseData( iterations = iterations, @@ -143,7 +143,7 @@ class Stats( setUp = setUp, test = test, tearDown = tearDown, - profileEnabled = profileEnabled + profilerEnabled = profilerEnabled ) val block = { warmUpPhase(warmPhaseData) @@ -307,7 +307,7 @@ class Stats( phaseName: String, attempt: Int ): PhaseProfiler { - val profilerHandler = if (phaseData.profileEnabled) ProfilerHandler.getInstance() else DummyProfilerHandler + val profilerHandler = if (phaseData.profilerEnabled) ProfilerHandler.getInstance() else DummyProfilerHandler return if (profilerHandler != DummyProfilerHandler) { val profilerPath = pathToResource("profile/${plainname()}") @@ -429,7 +429,7 @@ data class PhaseData( val setUp: (TestData) -> Unit, val test: (TestData) -> Unit, val tearDown: (TestData) -> Unit, - val profileEnabled: Boolean = false + val profilerEnabled: Boolean = false ) data class TestData(var setUpValue: SV?, var value: TV?) {