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 

하지만 동일한 문자열의 압축이 아주 짧은 시간 (이 100ms 미만)에 걸린다. 여기서 내가 뭘 잘못하고 있니?

+2

'outStr + = line' 대신'StringBuilder'를 사용해보십시오. – Jack

+0

이 작업이 더 빨라짐을 발견했습니다. http://stackoverflow.com/a/10572491/393639 – dinesh707

답변

0

문제 (디버그 코멘트 내 나쁜 방법 이외의)이 있습니다 :

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

String 연결은 암시 적으로 다음 2 문자열을 추가 그것에 toString() 메소드를 호출하는 StringBuilder을 생성합니다.

을 사용하면 하나의 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()을 부르지 않는 것이 좋습니다. StringBuilderCharSequence을 구현하며 많은 방법은 String과 마찬가지로 CharSequence을 허용합니다.

관련 문제