jdk/test/java/util/zip/FlaterCriticalArray.java
author martin
Tue, 15 Sep 2015 21:56:04 -0700
changeset 32649 2ee9017c7597
parent 9023 6175922846a4
permissions -rw-r--r--
8136583: Core libraries should use blessed modifier order Summary: Run blessed-modifier-order script (see bug) Reviewed-by: psandoz, chegar, alanb, plevart
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9023
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
     1
/*
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
     2
 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
     4
 *
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
     7
 * published by the Free Software Foundation.
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
     8
 *
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    13
 * accompanied this code).
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    14
 *
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    18
 *
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    21
 * questions.
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    22
 */
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    23
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    24
/**
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    25
 * ZIP inflater/deflater performance.
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    26
 */
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    27
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    28
/*
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    29
 * Run this test on JDK 6 and on later
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    30
 * JDKs to compare results:
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    31
 *     java -server -Xms1024M -Xmx1024M -Ddebug=true FlaterCriticalArray
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    32
 *
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    33
 * The performance issues can be readily seen on JDK 6, and so this code is
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    34
 * written to compile on that platform: it does *not* use any JDK 7 - specific
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    35
 * features.
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    36
 */
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    37
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    38
import java.io.*;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    39
import java.nio.*;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    40
import java.util.*;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    41
import java.util.zip.*;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    42
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    43
public class FlaterCriticalArray {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    44
    // If true, print information about performance
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    45
    private static final boolean debug = System.getProperty("debug") != null;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    46
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    47
    private static void debug(String s) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    48
        if (debug) System.out.println(s);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    49
    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    50
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    51
    private static void debug(String name, String inOut, long time, int length) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    52
        debug(name + ": Duration of " + inOut + "(in ms): " + time);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    53
        debug(name + ": " + inOut + "d data length: " + length + " bytes");
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    54
    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    55
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    56
    private static byte[] grow(byte[] a, int capacity) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    57
        while (a.length < capacity) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    58
            byte[] a2 = new byte[a.length * 2];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    59
            System.arraycopy(a, 0, a2, 0, a.length);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    60
            a = a2;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    61
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    62
        return a;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    63
    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    64
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    65
    private static byte[] trim(byte[] a, int length) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    66
        byte[] res = new byte[length];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    67
        System.arraycopy(a, 0, res, 0, length);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    68
        return res;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    69
    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    70
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    71
    /*
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    72
     * Base class for individual test cases
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    73
     */
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 9023
diff changeset
    74
    private abstract static class TestCase {
9023
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    75
        protected String name;  // For information in debug messages
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    76
        protected byte data[];  // Data to be deflated and subsequently inflated
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    77
        protected int level;    // Compression level for deflater
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    78
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    79
        protected TestCase(String name, byte data[]) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    80
            this(name, data, -1);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    81
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    82
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    83
        protected TestCase(String name, byte data[], int level) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    84
            this.name = name;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    85
            this.data = data;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    86
            this.level = level;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    87
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    88
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    89
        public void runTest() throws Throwable {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    90
            long time0, time1;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    91
            byte deflated[], inflated[];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    92
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    93
            debug("");
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    94
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    95
            time0 = System.currentTimeMillis();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    96
            deflated = deflate(data, level);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    97
            time1 = System.currentTimeMillis();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    98
            inform("Deflate", time1 - time0, deflated.length);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
    99
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   100
            time0 = System.currentTimeMillis();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   101
            inflated = inflate(deflated);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   102
            time1 = System.currentTimeMillis();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   103
            inform("Inflate", time1 - time0, inflated.length);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   104
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   105
            check(Arrays.equals(data, inflated),
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   106
                  name + ": Inflated and deflated arrays do not match");
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   107
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   108
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   109
        private void inform(String inOut, long duration, int length) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   110
            debug(name, inOut, duration, length);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   111
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   112
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 9023
diff changeset
   113
        protected abstract byte[] deflate(byte data[], int level) throws Throwable;
9023
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   114
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 9023
diff changeset
   115
        protected abstract byte[] inflate(byte deflated[]) throws Throwable;
9023
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   116
    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   117
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   118
    /*
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   119
     * Following are  the individual test cases
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   120
     */
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   121
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   122
    private static class StrideTest extends TestCase {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   123
        static final int STRIDE = 1024;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   124
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   125
        public StrideTest(byte data[], int level) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   126
            super("STRIDE", data, level);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   127
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   128
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   129
        protected byte[] deflate(byte in[], int level) throws Throwable {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   130
            final int len = in.length;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   131
            final Deflater deflater = new Deflater(level);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   132
            final byte[] smallBuffer = new byte[32];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   133
            byte[] flated = new byte[32];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   134
            int count = 0;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   135
            for (int i = 0; i<len; i+= STRIDE) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   136
                deflater.setInput(in, i, Math.min(STRIDE, len-i));
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   137
                while (!deflater.needsInput()) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   138
                    int n = deflater.deflate(smallBuffer);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   139
                    flated = grow(flated, count + n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   140
                    System.arraycopy(smallBuffer, 0, flated, count, n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   141
                    count += n;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   142
                }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   143
            }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   144
            deflater.finish();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   145
            int n;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   146
            do {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   147
                n = deflater.deflate(smallBuffer);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   148
                flated = grow(flated, count + n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   149
                System.arraycopy(smallBuffer, 0, flated, count, n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   150
                count += n;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   151
            } while (n > 0);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   152
            return trim(flated, count);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   153
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   154
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   155
        protected byte[] inflate(byte in[]) throws Throwable {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   156
            final int len = in.length;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   157
            final Inflater inflater = new Inflater();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   158
            final byte[] smallBuffer = new byte[3200];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   159
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   160
            byte[] flated = new byte[32];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   161
            int count = 0;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   162
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   163
            for (int i = 0; i<len; i+= STRIDE) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   164
                inflater.setInput(in, i, Math.min(STRIDE, len-i));
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   165
                while (!inflater.needsInput()) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   166
                    int n;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   167
                    while ((n = inflater.inflate(smallBuffer)) > 0) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   168
                        flated = grow(flated, count + n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   169
                        System.arraycopy(smallBuffer, 0, flated, count, n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   170
                        count += n;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   171
                    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   172
                }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   173
            }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   174
            return trim(flated, count);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   175
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   176
    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   177
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   178
    private static class NoStrideTest extends TestCase {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   179
        public NoStrideTest(byte data[], int level) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   180
            super("NO STRIDE", data, level);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   181
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   182
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   183
        public byte[] deflate(byte in[], int level) throws Throwable {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   184
            final Deflater flater = new Deflater(level);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   185
            flater.setInput(in);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   186
            flater.finish();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   187
            final byte[] smallBuffer = new byte[32];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   188
            byte[] flated = new byte[32];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   189
            int count = 0;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   190
            int n;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   191
            while ((n = flater.deflate(smallBuffer)) > 0) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   192
                flated = grow(flated, count + n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   193
                System.arraycopy(smallBuffer, 0, flated, count, n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   194
                count += n;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   195
            }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   196
            return trim(flated, count);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   197
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   198
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   199
        public byte[] inflate(byte in[]) throws Throwable {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   200
            final Inflater flater = new Inflater();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   201
            flater.setInput(in);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   202
            final byte[] smallBuffer = new byte[32];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   203
            byte[] flated = new byte[32];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   204
            int count = 0;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   205
            int n;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   206
            while ((n = flater.inflate(smallBuffer)) > 0) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   207
                flated = grow(flated, count + n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   208
                System.arraycopy(smallBuffer, 0, flated, count, n);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   209
                count += n;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   210
            }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   211
            return trim(flated, count);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   212
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   213
    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   214
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   215
    /**
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   216
     * Check Deflater{In,Out}putStream by way of GZIP{In,Out}putStream
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   217
     */
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   218
    private static class GZIPTest extends TestCase {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   219
        public GZIPTest(byte data[]) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   220
            super("GZIP", data);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   221
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   222
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   223
        public byte[] deflate(byte data[], int ignored) throws Throwable {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   224
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   225
            OutputStream gzos = new GZIPOutputStream(baos);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   226
            gzos.write(data, 0, data.length);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   227
            gzos.close();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   228
            return baos.toByteArray();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   229
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   230
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   231
        public byte[] inflate(byte deflated[]) throws Throwable {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   232
            InputStream bais = new ByteArrayInputStream(deflated);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   233
            GZIPInputStream gzis = new GZIPInputStream(bais);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   234
            byte[] inflated = new byte[data.length];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   235
            int numRead = 0;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   236
            int count = 0;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   237
            while ((numRead = gzis.read(inflated, count, data.length - count)) > 0) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   238
                count += numRead;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   239
            }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   240
            check(count == data.length, name + ": Read " + count + "; expected " + data.length);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   241
            return inflated;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   242
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   243
    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   244
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   245
    public static void realMain(String[] args) throws Throwable {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   246
        byte data[];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   247
        int level = -1;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   248
        if (args.length > 0) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   249
          level = Integer.parseInt(args[0]);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   250
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   251
        debug("Using level " + level);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   252
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   253
        if (args.length > 1) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   254
            FileInputStream fis = new FileInputStream(args[1]);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   255
            int len = fis.available();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   256
            data = new byte[len];
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   257
            check(fis.read(data, 0, len) == len, "Did not read complete file");
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   258
            debug("Original data from " + args[1]);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   259
            fis.close();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   260
        } else {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   261
            ByteBuffer bb = ByteBuffer.allocate(8);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   262
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   263
            for (int i = 0; i < 1024 * 64; i++) { // data length
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   264
                bb.putDouble(0, Math.random());
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   265
                baos.write(bb.array(), 0, 8);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   266
            }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   267
            data = baos.toByteArray();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   268
            debug("Original data from random byte array");
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   269
        }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   270
        debug("Original data length: " + data.length + " bytes");
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   271
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   272
        new StrideTest(data, level).runTest();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   273
        new NoStrideTest(data, level).runTest();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   274
        new GZIPTest(data).runTest();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   275
    }
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   276
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   277
    //--------------------- Infrastructure ---------------------------
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   278
    static volatile int passed = 0, failed = 0;
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   279
    static void pass() {passed++;}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   280
    static void pass(String msg) {System.out.println(msg); passed++;}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   281
    static void fail() {failed++; Thread.dumpStack();}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   282
    static void fail(String msg) {System.out.println(msg); fail();}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   283
    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   284
    static void unexpected(Throwable t, String msg) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   285
        System.out.println(msg); failed++; t.printStackTrace();}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   286
    static boolean check(boolean cond) {if (cond) pass(); else fail(); return cond;}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   287
    static boolean check(boolean cond, String msg) {if (cond) pass(); else fail(msg); return cond;}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   288
    static void equal(Object x, Object y) {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   289
        if (x == null ? y == null : x.equals(y)) pass();
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   290
        else fail(x + " not equal to " + y);}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   291
    public static void main(String[] args) throws Throwable {
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   292
        try {realMain(args);} catch (Throwable t) {unexpected(t);}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   293
        System.out.println("\nPassed = " + passed + " failed = " + failed);
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   294
        if (failed > 0) throw new AssertionError("Some tests failed");}
6175922846a4 6751338: ZIP inflater/deflater performance
sherman
parents:
diff changeset
   295
}