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()また、結果が必要ない場合は、結果を呼び出さないことを検討してください。StringBuilderimplementsCharSequenceと多くのメソッドが sCharSequenceと同様に受け入れStringます。

于 2014-10-01T10:46:29.797 に答える