From 713faa7a3fcd7d5b541211335d9decd39a8c25f0 Mon Sep 17 00:00:00 2001 From: Robert Hencke Date: Sat, 8 Apr 2017 13:11:41 -0400 Subject: [PATCH] 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. --- .../kotlin/com/beust/kobalt/misc/JarUtils.kt | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/JarUtils.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/JarUtils.kt index 0837012d..81f55b8e 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/JarUtils.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/JarUtils.kt @@ -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() } }