Java > StringBuilderの性能
更新日
2011-12-04
広告
Stringオブジェクトを何度も連結するような場合は、StringBuilderの利用を検討する価値があります。(Java 1.6)
例えば
String str = "some string"; : str += "string 2"; : str += "string 3"; :というプログラムを書く必要がある場合、StringBuilderを利用すると処理性能が向上する可能性があります。
ただし、どんなときでもStringBuilderを利用すれば性能向上するわけではありません。
試しに、以下の3つのメソッドを、それぞれ1000回ずつ実行して、経過時間を計測してみます。
// Stringを複数回に分けて結合 private static String concatNumberMultiLine() { String str = "1234567890"; str += "1234567890"; return str += "1234567890"; } // StringをStringBuilderで結合 private static String concatNumberBuilder() { StringBuilder sb = new StringBuilder(64); sb.append("1234567890"); sb.append("1234567890"); sb.append("1234567890"); return sb.toString(); } // Stringを1度に結合 private static String concatNumberOneLine() { return "1234567890" + "1234567890" + "1234567890"; }結果は以下のとおりです(単位はマイクロ秒)。
StringBuilder$ java StringVsStringBuilder2 multiLine 04467 micro second builder 01995 micro second oneLine 00033 micro second
この結果から、以下のことが言えます。
- 1度に全文字列を結合できるなら、プラス演算子で結合すると速い。また、プログラムが簡潔。
- 文字列を複数回に分けて結合する必要があるなら、StringBuilderの利用により速くなる可能性あり。
最後に、今回の評価に利用したプログラムを記します。
import java.text.*; public class StringVsStringBuilder2 { private static final int LOOP = 1000; public static void main(String[] args) { DecimalFormat df = new DecimalFormat("0"); df.setMaximumIntegerDigits(5); df.setMinimumIntegerDigits(5); long time; time = multiLineLoop(LOOP); System.out.println("multiLine " + df.format(time / 1000) + " micro second"); time = multiLineLoopBuilder(LOOP); System.out.println("builder " + df.format(time / 1000) + " micro second"); time = oneLineLoop(LOOP); System.out.println("oneLine " + df.format(time / 1000) + " micro second"); } public static long multiLineLoop(int loop) { long s = System.nanoTime(); for (int i = 0; i < loop; i++) { concatNumberMultiLine(); } long f = System.nanoTime(); return (f - s); } // Stringを複数回に分けて結合 private static String concatNumberMultiLine() { String str = "1234567890"; str += "1234567890"; return str += "1234567890"; } public static long multiLineLoopBuilder(int loop) { long s = System.nanoTime(); for (int i = 0; i < loop; i++) { concatNumberBuilder(); } long f = System.nanoTime(); return (f - s); } // StringをStringBuilderで結合 private static String concatNumberBuilder() { StringBuilder sb = new StringBuilder(64); sb.append("1234567890"); sb.append("1234567890"); sb.append("1234567890"); return sb.toString(); } public static long oneLineLoop(int loop) { long s = System.nanoTime(); for (int i = 0; i < loop; i++) { concatNumberOneLine(); } long f = System.nanoTime(); return (f - s); } // Stringを1回で結合 private static String concatNumberOneLine() { return "1234567890" + "1234567890" + "1234567890"; } }