2014-10-01 2 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 

Но сжатие той же строки занимает довольно короткий промежуток времени (менее 100 мс). Что я здесь делаю неправильно? (Кроме моей плохой способ отладки комментариев)

+2

Попробуйте использовать 'StringBuilder' вместо' outStr + = line'. – Jack

+0

Я нашел, что это работает быстрее: http://stackoverflow.com/a/10572491/393639 – dinesh707

ответ

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 даже свести к минимуму внутренних перераспределений. В примере я использовал 64 КБ, но если вы знаете, что ваш результат String будет намного больше, вы можете даже безопасно использовать несколько МБ.

Также подумайте о том, чтобы не называть toString() на результат, если он вам не нужен. StringBuilder реализует CharSequence и многие методы принимают CharSequence, а также String s.