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