String と StringBuffer の文字列連結速度のテスト

小ネタ。
仕事でかなりの量の文字列を連結する機会があった。で昔、ある程度以上の文字列
を連結するときは StringBuffer を使え、と教育されていたので
StringBuffer を選択したのだが、よく考えたらどれくらいの性能差が出るの
か確かめたことがなかったのでやってみた。

環境

Mac OS X 10.5.6
Java 1.5.0_16
CPU 1.6 GHz Intel Core 2 Duo
メモリ 2GB

コード

String は += で連結して、StringBuffer は append で連結し、それぞれ
100000回まわしてみる。

public class StringConcatTimeTest {
    private static final String s = "a";
    private static final int times = 100000;

    public static void main(String[] args) {
        String str = "";
        long t2 = System.currentTimeMillis();
        for (int i = 0; i < times; i++) {
            str += s;
        }
        System.out.println("time(String):" + (System.currentTimeMillis() - t2));
        
        t2 = System.currentTimeMillis();
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < times; i++) {
            buf.append(s);
        }
        System.out.println("All(StringBuffer):" + (System.currentTimeMillis() - t2));
    }
}

結果

$ java StringConcatTimeTest 
time(String):366004
All(StringBuffer):23

String 6分、StringBuffer 23ミリ秒ということで StringBuffer 圧勝。
あたりまえだけど。

追記というかやりなおし

StringBuilder を追加。

public class StringConcatTimeTest {
    private static final String s = "a";
    private static final int times = 100000;

    public static void main(String[] args) {
        String str = "";
        long t2 = System.currentTimeMillis();
        for (int i = 0; i < times; i++) {
            str += s;
        }
        System.out.println("time(String):" + (System.currentTimeMillis() - t2));
        
        t2 = System.currentTimeMillis();
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < times; i++) {
            buf.append(s);
        }
        System.out.println("All(StringBuffer):" + (System.currentTimeMillis() - t2));

        t2 = System.currentTimeMillis();
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < times; i++) {
            builder.append(s);
        }
        System.out.println("All(StringBuilder):" + (System.currentTimeMillis() - t2));

    }
}

結果

time(String):346309
All(StringBuffer):16
All(StringBuilder):15

StringBuffer と StringBuilder は同じくらいという結果。
始めて使ったけど。