目前我遇到的问题是这段代码将被调用 >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将 ByteArrayOutputStream
替换为 ByteBuffer
,但在创建时我不知道需要分配多少字节。
此外,我尝试使用 Inflater
但我偶然发现了描述的问题 here .
关于我可以做些什么来提高这段代码的性能的任何其他想法。
更新#1
最佳答案
分析您的应用程序,以确保您确实在此功能上花费了可优化的时间。调用此函数多少次并不重要;如果它没有占整个程序执行时间的很大一部分,那么优化就是浪费。
预先调整
ByteArrayOutputStream
的大小。默认缓冲区大小为 32 字节,调整大小需要复制所有现有字节。如果您知道解码后的数组大约为 1k,请使用new ByteArrayOutputStream(2048)
。使用预先分配的
byte[]
,一次读取一个 block ,而不是一次读取一个字节。请注意,您必须使用read
的返回值作为write
的输入。更好的是,使用像 Jakarta Commons 这样的东西 IOUtils.copy()以避免错误。
关于java - 如何提高 GZIP 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32550227/