1fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath/* 2fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * Copyright (C) 2016 The Android Open Source Project 3fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * 4fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * Licensed under the Apache License, Version 2.0 (the "License"); 5fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * you may not use this file except in compliance with the License. 6fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * You may obtain a copy of the License at 7fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * 8fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 9fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * 10fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * Unless required by applicable law or agreed to in writing, software 11fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 12fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * See the License for the specific language governing permissions and 14fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * limitations under the License 15fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath */ 16fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 17fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathpackage benchmarks; 18fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 19fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport com.google.caliper.BeforeExperiment; 20fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport com.google.caliper.Param; 21fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport java.io.File; 22fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport java.io.FileOutputStream; 23fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport java.io.IOException; 24fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport java.util.Enumeration; 25fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport java.util.Random; 26fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport java.util.zip.ZipEntry; 27fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport java.util.zip.ZipFile; 28fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathimport java.util.zip.ZipOutputStream; 29fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 30fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 31fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamathpublic class ZipFileBenchmark { 32fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 33fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath private File file; 34fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath @Param({"128", "1024", "8192"}) int numEntries; 35fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 36fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath @BeforeExperiment 37fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath protected void setUp() throws Exception { 38fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath System.setProperty("java.io.tmpdir", "/data/local/tmp"); 39fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath file = File.createTempFile(getClass().getName(), ".zip"); 40fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath file.deleteOnExit(); 41fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath writeEntries(new ZipOutputStream(new FileOutputStream(file)), numEntries, 0); 42fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath ZipFile zipFile = new ZipFile(file); 43fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath for (Enumeration<? extends ZipEntry> e = zipFile.entries(); e.hasMoreElements(); ) { 44fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath ZipEntry zipEntry = e.nextElement(); 45fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath } 46fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath zipFile.close(); 47fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath } 48fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 49fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath public void timeZipFileOpen(int reps) throws Exception { 50fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath for (int i = 0; i < reps; ++i) { 51fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath ZipFile zf = new ZipFile(file); 52fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath } 53fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath } 54fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 55fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath /** 56fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath * Compresses the given number of files, each of the given size, into a .zip archive. 57fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath */ 58fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath protected void writeEntries(ZipOutputStream out, int entryCount, long entrySize) 59fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath throws IOException { 60fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath byte[] writeBuffer = new byte[8192]; 61fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath Random random = new Random(); 62fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath try { 63fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath for (int entry = 0; entry < entryCount; ++entry) { 64fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath ZipEntry ze = new ZipEntry(Integer.toHexString(entry)); 65fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath ze.setSize(entrySize); 66fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath out.putNextEntry(ze); 67fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 68fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath for (long i = 0; i < entrySize; i += writeBuffer.length) { 69fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath random.nextBytes(writeBuffer); 70fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath int byteCount = (int) Math.min(writeBuffer.length, entrySize - i); 71fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath out.write(writeBuffer, 0, byteCount); 72fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath } 73fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath 74fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath out.closeEntry(); 75fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath } 76fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath } finally { 77fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath out.close(); 78fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath } 79fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath } 80fa07c88938c939eea9770e52f4813476e4ba6f3bNarayan Kamath} 81