[JS IR IC] Write only modified JS files

Optimization: the patch allows copying and overwriting
 only modified JS files during the compilation output writing routine.
This commit is contained in:
Alexander Korepanov
2022-12-21 17:39:01 +01:00
committed by Space Team
parent 75931fb9c8
commit fde71918ed
3 changed files with 46 additions and 6 deletions
@@ -86,9 +86,8 @@ class JsExecutableProducer(
) )
stopwatch.startNext("Committing compiled JS code") stopwatch.startNext("Committing compiled JS code")
jsMultiModuleCache.commitCompiledJsCode(artifact, compiledModule)
rebuildModules += moduleName rebuildModules += moduleName
return compiledModule return jsMultiModuleCache.commitCompiledJsCode(artifact, compiledModule)
} }
val cachedMainModule = cachedProgram.last() val cachedMainModule = cachedProgram.last()
@@ -102,13 +102,14 @@ class JsMultiModuleCache(private val moduleArtifacts: List<ModuleArtifact>) {
jsCodeFilePath?.let { CompilationOutputsCached(it, sourceMapFilePath, tsDefinitionsFilePath) } jsCodeFilePath?.let { CompilationOutputsCached(it, sourceMapFilePath, tsDefinitionsFilePath) }
} }
fun commitCompiledJsCode(artifact: ModuleArtifact, compilationOutputs: CompilationOutputsBuilt) = fun commitCompiledJsCode(artifact: ModuleArtifact, compilationOutputs: CompilationOutputsBuilt): CompilationOutputs =
artifact.artifactsDir?.let { cacheDir -> artifact.artifactsDir?.let { cacheDir ->
val jsCodeFile = File(cacheDir, CACHED_MODULE_JS) val jsCodeFile = File(cacheDir, CACHED_MODULE_JS)
val jsMapFile = File(cacheDir, CACHED_MODULE_JS_MAP) val jsMapFile = File(cacheDir, CACHED_MODULE_JS_MAP)
compilationOutputs.writeJsCode(jsCodeFile, jsMapFile) compilationOutputs.writeJsCode(jsCodeFile, jsMapFile)
File(cacheDir, CACHED_MODULE_D_TS).writeIfNotNull(compilationOutputs.tsDefinitions?.raw) File(cacheDir, CACHED_MODULE_D_TS).writeIfNotNull(compilationOutputs.tsDefinitions?.raw)
} CompilationOutputsBuiltForCache(jsCodeFile.absolutePath, jsMapFile.absolutePath, compilationOutputs)
} ?: compilationOutputs
fun loadProgramHeadersFromCache(): List<CachedModuleInfo> { fun loadProgramHeadersFromCache(): List<CachedModuleInfo> {
return moduleArtifacts.map { artifact -> return moduleArtifacts.map { artifact ->
@@ -74,6 +74,13 @@ class CompilationOutputsBuilt(
} }
} }
private fun File.copyModificationTimeFrom(from: File) {
val mtime = from.lastModified()
if (mtime > 0) {
setLastModified(mtime)
}
}
class CompilationOutputsCached( class CompilationOutputsCached(
private val jsCodeFilePath: String, private val jsCodeFilePath: String,
private val sourceMapFilePath: String?, private val sourceMapFilePath: String?,
@@ -86,10 +93,43 @@ class CompilationOutputsCached(
get() = null get() = null
override fun writeJsCode(outputJsFile: File, outputJsMapFile: File) { override fun writeJsCode(outputJsFile: File, outputJsMapFile: File) {
File(jsCodeFilePath).copyTo(outputJsFile, true) File(jsCodeFilePath).copyToIfModified(outputJsFile)
sourceMapFilePath?.let { sourceMapFilePath?.let {
File(it).copyTo(outputJsMapFile, true) File(it).copyToIfModified(outputJsMapFile)
}
}
private fun File.copyToIfModified(target: File) {
val thisMtime = lastModified()
val targetMtime = target.lastModified()
if (thisMtime <= 0 || targetMtime <= 0 || targetMtime > thisMtime) {
copyTo(target, true)
copyModificationTimeFrom(target)
} }
} }
} }
class CompilationOutputsBuiltForCache(
private val jsCodeFilePath: String,
private val sourceMapFilePath: String,
private val outputBuilt: CompilationOutputsBuilt
) : CompilationOutputs() {
init {
dependencies = outputBuilt.dependencies
}
override val tsDefinitions: TypeScriptFragment?
get() = outputBuilt.tsDefinitions
override val jsProgram: JsProgram?
get() = outputBuilt.jsProgram
override fun writeJsCode(outputJsFile: File, outputJsMapFile: File) {
outputBuilt.writeJsCode(outputJsFile, outputJsMapFile)
File(jsCodeFilePath).copyModificationTimeFrom(outputJsFile)
File(sourceMapFilePath).copyModificationTimeFrom(outputJsMapFile)
}
}