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";
    }

}
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system