目前,我确实有一个问题,这段代码被调用的次数超过500k。压缩后的byte[]的大小小于1KB。每次调用该方法时,都必须创建所有流。因此,我正在寻找一种改进此代码的方法。

private byte[] unzip(byte[] data) throws IOException, DataFormatException {

    byte[] unzipData = new byte[4096];

    try (ByteArrayInputStream in = new ByteArrayInputStream(data);
         GZIPInputStream gzipIn = new GZIPInputStream(in);
         ByteArrayOutputStream out = new ByteArrayOutputStream()) {

        int read = 0;
        while( (read = gzipIn.read(unzipData)) != -1) {
            out.write(unzipData, 0, read);
        }

        return out.toByteArray();
    }
}

我已经tried替换为ByteArrayOutputStreamByteBuffer,但是在创建时我不知道需要分配多少字节。

另外,我尝试使用Inflater,但偶然发现了描述为here的问题。

任何其他想法,我可以做些什么来改善此代码的性能。

UPDATE#1
  • 也许this lib可以帮助某人。
  • 也有一个打开的JDK-Bug
  • 最佳答案

  • 对应用程序进行配置,以确保您确实在此功能上花费了可优化的时间。调用该函数多少次无关紧要;如果它不占整个程序执行时间的很大一部分,那么优化就被浪费了。
  • 调整ByteArrayOutputStream的大小。默认缓冲区大小为32字节,并且调整大小要求复制所有现有字节。如果您知道解码后的数组大约为1k,请使用new ByteArrayOutputStream(2048)
  • 使用预分配的byte[]而不是一次读取一个字节,而是一次读取一个块。注意,必须使用read的返回值作为write的输入。更好的方法是使用类似Jakarta Commons的IOUtils.copy()以避免错误。
  • 关于java - 如何提高GZIP性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32550227/

    10-12 21:45