java - 如何提高 GZIP 性能

标签 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();
    }
}

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

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

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

更新#1

  • 也许this lib 帮助某人。
  • 还有一个开放的JDK-Bug .

最佳答案

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

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

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

关于java - 如何提高 GZIP 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32550227/

相关文章:

mysql 简单更新 4000 万和 128GB RAM 花费太多时间

linux - 可安全中断的连续流压缩

java - 如何从DB和JTable中删除选定的行?

java - 构建 ionic 应用程序时出现 "Your JAVA_HOME is invalid: C:\Program Files\Java\jdk1.8.0_301"

Javascript:计算传输的总字节数和渲染页面的总请求数?

javascript - 使用 $(this).scrollWidth 获取实际宽度非常慢

python - 将数据帧作为压缩的 csv 直接上传到 s3,而不将其保存在本地计算机上

php - 在 php 上从 CURL 解压一个 gzip 文件

java - 在 Apache NiFi 中读取 UCS-2 LE BOM 编码文件时出现问题

Java堆空间程序性能