Introduce performance test for light classes building (top-level)

So #KT-24085 In Progress
This commit is contained in:
Mikhail Glukhikh
2018-04-19 16:17:00 +03:00
parent 98fe8eaa42
commit 1861e0a21d
7 changed files with 87 additions and 25 deletions
@@ -0,0 +1,49 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.perf
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.cfg.pseudocode.containingDeclarationForPseudocode
import org.jetbrains.kotlin.idea.refactoring.toPsiFile
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtVisitorVoid
import kotlin.system.measureNanoTime
class AllKotlinLightClassTest : WholeProjectPerformanceTest(), WholeProjectKotlinFileProvider {
override fun doTest(file: VirtualFile): PerFileTestResult {
val results = mutableMapOf<String, Long>()
var totalNs = 0L
val psiFile = file.toPsiFile(project) ?: run {
return PerFileTestResult(results, totalNs, listOf(AssertionError("PsiFile not found for $file")))
}
val errors = mutableListOf<Throwable>()
val result = measureNanoTime {
try {
// Build light class by PsiFile
psiFile.acceptRecursively(object : KtVisitorVoid() {
override fun visitClassOrObject(classOrObject: KtClassOrObject) {
if (classOrObject.containingDeclarationForPseudocode != null) return
val lightClass = classOrObject.toLightClass() ?: return
lightClass.hashCode()
}
})
} catch (t: Throwable) {
t.printStackTrace()
errors += t
}
}
results["LightClasses_Top"] = result
totalNs += result
return PerFileTestResult(results, totalNs, errors)
}
}
@@ -0,0 +1,13 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.perf
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
interface WholeProjectFileProvider {
fun provideFiles(project: Project): Collection<VirtualFile>
}
@@ -19,8 +19,6 @@ import kotlin.system.measureNanoTime
abstract class WholeProjectInspectionTest : WholeProjectPerformanceTest() {
abstract override fun provideFiles(): Collection<VirtualFile>
class ExceptionWhileInspection(inspectionId: String, cause: Throwable) : RuntimeException(inspectionId, cause)
private lateinit var profileTools: List<Tools>
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.perf
import com.intellij.codeInspection.ex.Tools
import com.intellij.ide.highlighter.JavaFileType
import com.intellij.lang.java.JavaLanguage
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.DelegatingGlobalSearchScope
@@ -17,7 +18,7 @@ import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
class WholeProjectJavaInspectionTest : WholeProjectInspectionTest() {
override fun provideFiles(): Collection<VirtualFile> {
override fun provideFiles(project: Project): Collection<VirtualFile> {
val scope = object : DelegatingGlobalSearchScope(ProjectScope.getContentScope(project)) {
val index = ProjectFileIndex.getInstance(myProject)
override fun contains(file: VirtualFile): Boolean {
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.perf
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.FileTypeIndex
import com.intellij.psi.search.ProjectScope
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
interface WholeProjectKotlinFileProvider : WholeProjectFileProvider {
override fun provideFiles(project: Project): Collection<VirtualFile> {
val scope = KotlinSourceFilterScope.projectSources(ProjectScope.getContentScope(project), project)
return FileTypeIndex.getFiles(KotlinFileType.INSTANCE, scope)
}
}
@@ -6,17 +6,7 @@
package org.jetbrains.kotlin.idea.perf
import com.intellij.codeInspection.ex.Tools
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.FileTypeIndex
import com.intellij.psi.search.ProjectScope
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
class WholeProjectKotlinInspectionTest : WholeProjectInspectionTest() {
override fun provideFiles(): Collection<VirtualFile> {
val scope = KotlinSourceFilterScope.projectSources(ProjectScope.getContentScope(project), project)
return FileTypeIndex.getFiles(KotlinFileType.INSTANCE, scope)
}
class WholeProjectKotlinInspectionTest : WholeProjectInspectionTest(), WholeProjectKotlinFileProvider {
override fun isEnabledInspection(tools: Tools) = tools.tool.language in setOf(null, "kotlin", "UAST")
}
@@ -9,21 +9,14 @@ import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase
import com.intellij.ide.impl.ProjectUtil
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ex.ApplicationEx
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.psi.search.FileTypeIndex
import com.intellij.psi.search.ProjectScope
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope
import java.io.File
import java.io.PrintWriter
import java.io.StringWriter
abstract class WholeProjectPerformanceTest : DaemonAnalyzerTestCase() {
abstract class WholeProjectPerformanceTest : DaemonAnalyzerTestCase(), WholeProjectFileProvider {
private val rootProjectFile: File = File("../perfTestProject").absoluteFile
private val statsFile: File = File("build/stats.csv").absoluteFile
@@ -43,8 +36,6 @@ abstract class WholeProjectPerformanceTest : DaemonAnalyzerTestCase() {
protected abstract fun doTest(file: VirtualFile): PerFileTestResult
abstract fun provideFiles(): Collection<VirtualFile>
fun testWholeProjectPerformance() {
tcSuite(this::class.simpleName ?: "Unknown") {
@@ -67,7 +58,7 @@ abstract class WholeProjectPerformanceTest : DaemonAnalyzerTestCase() {
}
tcSuite("TotalPerFile") {
val files = provideFiles()
val files = provideFiles(project)
files.forEach {
val filePath = File(it.path).relativeTo(tmp).path.replace(File.separatorChar, '/')