summaryrefslogtreecommitdiff
path: root/benchmarks
diff options
context:
space:
mode:
authorPrzemyslaw Szczepaniak <pszczepaniak@google.com>2017-09-12 10:05:39 +0100
committerPrzemyslaw Szczepaniak <pszczepaniak@google.com>2017-09-27 13:06:58 +0100
commite1754ddc8656fa8b2c1a0ec828125820a190fd13 (patch)
treefd59f0b9e28e1a239acf6a1f2ed6db0a0df58a3b /benchmarks
parent8ff194011cfaae5d532e04c0ee536e4c43addb09 (diff)
Increase ZipFile read buffers size to 64k
Fixes performance regression introduced in Android N. Increased size of buffer for Inflater in ZipFile.getInputStream from 8k to 64k. Replaced temp stack in bufferZipFile_read with GetByteArrayElements. ZipFileReadBenchmark results on pixel device: Without the change: Experiment {instrument=runtime, benchmarkMethod=timeZipFileRead, vm=default, parameters={readBufferSize=1024}} runtime(ns): min=11591794.71, 1st qu.=11591794.71, median=11591794.71, mean=11591794.71, 3rd qu.=11591794.71, max=11591794.71 Experiment {instrument=runtime, benchmarkMethod=timeZipFileRead, vm=default, parameters={readBufferSize=16384}} runtime(ns): min=4913842.09, 1st qu.=4913842.09, median=4913842.09, mean=4913842.09, 3rd qu.=4913842.09, max=4913842.09 Experiment {instrument=runtime, benchmarkMethod=timeZipFileRead, vm=default, parameters={readBufferSize=65536}} runtime(ns): min=4888673.69, 1st qu.=4888673.69, median=4888673.69, mean=4888673.69, 3rd qu.=4888673.69, max=4888673.69 With the change: Experiment {instrument=runtime, benchmarkMethod=timeZipFileRead, vm=default, parameters={readBufferSize=1024}} runtime(ns): min=11415217.04, 1st qu.=11415217.04, median=11415217.04, mean=11415217.04, 3rd qu.=11415217.04, max=11415217.04 Experiment {instrument=runtime, benchmarkMethod=timeZipFileRead, vm=default, parameters={readBufferSize=16384}} runtime(ns): min=2690763.53, 1st qu.=2690763.53, median=2690763.53, mean=2690763.53, 3rd qu.=2690763.53, max=2690763.53 Experiment {instrument=runtime, benchmarkMethod=timeZipFileRead, vm=default, parameters={readBufferSize=65536}} runtime(ns): min=2202639.03, 1st qu.=2202639.03, median=2202639.03, mean=2202639.03, 3rd qu.=2202639.03, max=2202639.03 Test: vogar run of test in *.java.util.zip packages Bug: 65491407 Change-Id: I7734dde9e6e02b1fbff7209c1256a16ded1654e6
Diffstat (limited to 'benchmarks')
-rw-r--r--benchmarks/src/benchmarks/ZipFileReadBenchmark.java90
1 files changed, 90 insertions, 0 deletions
diff --git a/benchmarks/src/benchmarks/ZipFileReadBenchmark.java b/benchmarks/src/benchmarks/ZipFileReadBenchmark.java
new file mode 100644
index 0000000000..f6125a6130
--- /dev/null
+++ b/benchmarks/src/benchmarks/ZipFileReadBenchmark.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package benchmarks;
+
+import com.google.caliper.BeforeExperiment;
+import com.google.caliper.Param;
+import java.io.File;
+import java.io.InputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Random;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+
+public class ZipFileReadBenchmark {
+ private File file;
+ @Param({"1024", "16384", "65536"}) int readBufferSize;
+
+ @BeforeExperiment
+ protected void setUp() throws Exception {
+ System.setProperty("java.io.tmpdir", "/data/local/tmp");
+ file = File.createTempFile(getClass().getName(), ".zip");
+ writeEntries(new ZipOutputStream(new FileOutputStream(file)), 2, 1024*1024);
+ ZipFile zipFile = new ZipFile(file);
+ for (Enumeration<? extends ZipEntry> e = zipFile.entries(); e.hasMoreElements(); ) {
+ ZipEntry zipEntry = e.nextElement();
+ }
+ zipFile.close();
+ }
+
+ /**
+ * Compresses the given number of files, each of the given size, into a .zip archive.
+ */
+ protected void writeEntries(ZipOutputStream out, int entryCount, long entrySize)
+ throws IOException {
+ byte[] writeBuffer = new byte[8192];
+ Random random = new Random();
+ try {
+ for (int entry = 0; entry < entryCount; ++entry) {
+ ZipEntry ze = new ZipEntry(Integer.toHexString(entry));
+ ze.setSize(entrySize);
+ out.putNextEntry(ze);
+
+ for (long i = 0; i < entrySize; i += writeBuffer.length) {
+ random.nextBytes(writeBuffer);
+ int byteCount = (int) Math.min(writeBuffer.length, entrySize - i);
+ out.write(writeBuffer, 0, byteCount);
+ }
+
+ out.closeEntry();
+ }
+ } finally {
+ out.close();
+ }
+ }
+
+ public void timeZipFileRead(int reps) throws Exception {
+ byte readBuffer[] = new byte[readBufferSize];
+ for (int i = 0; i < reps; ++i) {
+ ZipFile zipFile = new ZipFile(file);
+ for (Enumeration<? extends ZipEntry> e = zipFile.entries(); e.hasMoreElements(); ) {
+ ZipEntry zipEntry = e.nextElement();
+ InputStream is = zipFile.getInputStream(zipEntry);
+ while (true) {
+ if (is.read(readBuffer, 0, readBuffer.length) < 0) {
+ break;
+ }
+ }
+ }
+ zipFile.close();
+ }
+ }
+}