1
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 毫秒)。我在这里做错了什么?(除了我不好的调试评论方式)

4

1 回答 1

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以及Strings。

于 2014-10-01T10:46:29.797 回答