2014-10-01 36 views
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()); 

上述代碼打印爲什麼GZIPInputStream需要相當長的時間?

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

但相同的字符串的壓縮需要相當短的時間(小於100ms)。我在這裏做錯了什麼?

+2

嘗試使用'StringBuilder'而不是'outStr + = line'。 – Jack 2014-10-01 10:44:06

+0

我發現這個工作更快:http://stackoverflow.com/a/10572491/393639 – dinesh707 2014-10-01 10:46:59

回答

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 s。

相關問題