1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-26 08:27:12 -07:00

Reduce time spent in JAR/ZIP assembly.

Locally, this reduces a run of kobaltw assemble --noIncremental
on the Kobalt codebase itself from 47 seconds to 25 seconds.

When JarInputStream.nextEntry is invoked, the stream sets its position
and length so that it can directly be used to read the underlying content
associated with the entry.  This avoids the need to call
JarFile(localFile).getInputStream(entry) and the cost associated with it.

addEntry has a slight change of semantics due to this change - it is now
the caller's responsibility to close the associated input stream.  The two
existing calls to the method were adjusted accordingly.
This commit is contained in:
Robert Hencke 2017-04-08 13:11:41 -04:00
parent ebf272bf98
commit 713faa7a3f

View file

@ -53,20 +53,22 @@ class JarUtils {
} else {
if (file.expandJarFiles && foundFile.name.endsWith(".jar") && ! file.from.contains("resources")) {
kobaltLog(2, " Writing contents of jar file $foundFile")
val stream = JarInputStream(FileInputStream(localFile))
var entry = stream.nextEntry
while (entry != null) {
if (!entry.isDirectory && !KFiles.isExcluded(entry.name, DEFAULT_JAR_EXCLUDES)) {
val ins = JarFile(localFile).getInputStream(entry)
addEntry(ins, JarEntry(entry), outputStream, onError)
JarInputStream(FileInputStream(localFile)).use { stream ->
var entry = stream.nextEntry
while (entry != null) {
if (!entry.isDirectory && !KFiles.isExcluded(entry.name, DEFAULT_JAR_EXCLUDES)) {
addEntry(stream, JarEntry(entry), outputStream, onError)
}
entry = stream.nextEntry
}
entry = stream.nextEntry
}
} else {
val entryFileName = KFiles.fixSlashes(file.to(foundFile.path))
val entry = JarEntry(entryFileName)
entry.time = localFile.lastModified()
addEntry(FileInputStream(localFile), entry, outputStream, onError)
FileInputStream(localFile).use { stream ->
addEntry(stream, entry, outputStream, onError)
}
}
}
}
@ -74,22 +76,12 @@ class JarUtils {
private fun addEntry(inputStream: InputStream, entry: ZipEntry, outputStream: ZipOutputStream,
onError: (Exception) -> Unit = DEFAULT_HANDLER) {
var bis: BufferedInputStream? = null
try {
outputStream.putNextEntry(entry)
bis = BufferedInputStream(inputStream)
val buffer = ByteArray(50 * 1024)
while (true) {
val count = bis.read(buffer)
if (count == -1) break
outputStream.write(buffer, 0, count)
}
inputStream.copyTo(outputStream, 50 * 1024)
outputStream.closeEntry()
} catch(ex: Exception) {
onError(ex)
} finally {
bis?.close()
}
}