Cache classloaders for tools.jar and kapt in Gradle workers
#KT-28852 fixed The loaders and hence some classes were repeatedly loaded and jit-compiled everytime when KaptExecution were dispatched. Those classes, like JavaCompiler, can be very large and therefore created a significant overhead. In some projects, the overhead accounted for more than 40% of total CPU time of annotation processing. This change tries to cache the classloaders so that they won't be reloaded and re-jitted.
This commit is contained in:
committed by
Alexey Tsvetkov
parent
1ba6d5361b
commit
6c627fa5c1
+7
-2
@@ -100,19 +100,24 @@ private class KaptExecution @Inject constructor(
|
|||||||
private const val JAVAC_CONTEXT_CLASS = "com.sun.tools.javac.util.Context"
|
private const val JAVAC_CONTEXT_CLASS = "com.sun.tools.javac.util.Context"
|
||||||
|
|
||||||
private fun kaptClass(classLoader: ClassLoader) = Class.forName("org.jetbrains.kotlin.kapt3.base.Kapt", true, classLoader)
|
private fun kaptClass(classLoader: ClassLoader) = Class.forName("org.jetbrains.kotlin.kapt3.base.Kapt", true, classLoader)
|
||||||
|
private var cachedClassLoaderWithToolsJar: ClassLoader? = null
|
||||||
|
private var cachedKaptClassLoader: ClassLoader? = null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun run(): Unit = with(optionsForWorker) {
|
override fun run(): Unit = with(optionsForWorker) {
|
||||||
val kaptClasspathUrls = kaptClasspath.map { it.toURI().toURL() }.toTypedArray()
|
val kaptClasspathUrls = kaptClasspath.map { it.toURI().toURL() }.toTypedArray()
|
||||||
val rootClassLoader = findRootClassLoader()
|
val rootClassLoader = findRootClassLoader()
|
||||||
|
|
||||||
val classLoaderWithToolsJar = if (toolsJar != null && !javacIsAlreadyHere()) {
|
val classLoaderWithToolsJar = cachedClassLoaderWithToolsJar ?: if (toolsJar != null && !javacIsAlreadyHere()) {
|
||||||
URLClassLoader(arrayOf(toolsJar.toURI().toURL()), rootClassLoader)
|
URLClassLoader(arrayOf(toolsJar.toURI().toURL()), rootClassLoader)
|
||||||
} else {
|
} else {
|
||||||
rootClassLoader
|
rootClassLoader
|
||||||
}
|
}
|
||||||
|
cachedClassLoaderWithToolsJar = classLoaderWithToolsJar
|
||||||
|
|
||||||
|
val kaptClassLoader = cachedKaptClassLoader ?: URLClassLoader(kaptClasspathUrls, classLoaderWithToolsJar)
|
||||||
|
cachedKaptClassLoader = kaptClassLoader
|
||||||
|
|
||||||
val kaptClassLoader = URLClassLoader(kaptClasspathUrls, classLoaderWithToolsJar)
|
|
||||||
val kaptMethod = kaptClass(kaptClassLoader).declaredMethods.single { it.name == "kapt" }
|
val kaptMethod = kaptClass(kaptClassLoader).declaredMethods.single { it.name == "kapt" }
|
||||||
kaptMethod.invoke(null, createKaptOptions(kaptClassLoader))
|
kaptMethod.invoke(null, createKaptOptions(kaptClassLoader))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user