如何提高 GZIP 性能

Chr*_*utz 6 java performance gzip

目前我确实遇到了这段代码将被调用 > 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试ByteArrayOutputStream用 a替换ByteBuffer,但在创建时我不知道需要分配多少字节。

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

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

更新#1

  • 也许这个库可以帮助某人。
  • 还有一个开放的JDK-Bug

小智 4

  1. 分析您的应用程序,以确保您确实在此功能上花费了优化的时间。调用该函数多少次并不重要;如果它不占整个程序执行时间的很大一部分,那么优化就被浪费了。

  2. 预先调整大小ByteArrayOutputStream。默认缓冲区大小为 32 字节,调整大小需要复制所有现有字节。如果您知道解码后的数组大小约为 1k,请使用new ByteArrayOutputStream(2048).

  3. 使用预分配的 .txt 文件一次读取一个块,而不是一次读取一个字节byte[]。请注意,您必须使用返回值read作为 的输入write更好的是,使用 Jakarta Commons IOUtils.copy()之类的东西来避免错误。