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毫秒)。我在这做错了什么? (除了我糟糕的调试评论方式)
答案 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
。