为什么GZIPInputStream需要很长时间?

时间:2014-10-01 10:39:51

标签: java compression gzip gzipstream gzipinputstream

System.out.println("Input String length : " + str.length());
System.out.println("SWB==="+sw.getTime());
byte[] bytes = Base64.decodeBase64(str);
System.out.println("SWB==="+sw.getTime());
GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes));
BufferedReader bf = new BufferedReader(new InputStreamReader(gis));
String outStr = "";
String line;
while ((line=bf.readLine())!=null) {
     outStr += line;
}
System.out.println("SWB==="+sw.getTime());
System.out.println("Output String lenght : " + outStr.length());

上面的代码打印

SWB===1
SWB===4
SWB===27052
Output String lenght : 1750825

但是相同字符串的压缩需要很短的时间(小于100毫秒)。我在这做错了什么? (除了我糟糕的调试评论方式)

1 个答案:

答案 0 :(得分:0)

问题在于:

String line;
while ((line=bf.readLine())!=null) {
     outStr += line;
}

每个String级联将隐式创建StringBuilder以附加2个字符串,然后在其上调用toString()方法。

使用单个StringBuilder大幅提升速度:

StringBuilder sb = new StringBuilder(65536); // Consider a large initial size
String line
while ((line=bf.readLine())!=null) {
     sb.append(line);
}

// OutString is in the sb StringBuilder
String outStr = sb.toString();

还要考虑较大的初始StringBuilder大小,以便最小化内部重新分配。在示例中,我使用了64KB,但如果您知道结果String会更大,您甚至可以安全地使用多个MB。

如果您不需要,请考虑不在结果上调用toString()StringBuilder实施CharSequence,许多方法接受CharSequence以及String

相关问题