[英]Why GZIPInputStream takes quite long time?
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毫秒)。 我在这里做错了什么? (除了我不良的调试注释方式)
问题是这样的:
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.