【问题标题】:Why GZIPInputStream takes quite long time?为什么 GZIPInputStream 需要很长时间?
【发布时间】:2014-10-01 10:39:51
【问题描述】:
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 毫秒)。我在这里做错了什么? (除了我调试 cmets 的坏方法)

【问题讨论】:

标签: java compression gzip gzipstream gzipinputstream


【解决方案1】:

问题是这样的:

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

每个String 连接都会隐式创建一个StringBuilder 来附加两个字符串,然后对其调用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。

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2011-12-29
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多