プログラムメモ

ちょっとしたサンプルや備忘録的な何かをメモ。

java StringBuffer/StringBuilder

StringBufferとStringBuilderでほぼ同等の機能を備えた2つだけど
StringBuilderを使うことがあまりなかった。

というのも、具体的なメリットをあまり感じられなかったから。

両者の違いはスレッドセーフの有無
すなわちsynchronizedであるかどうか、ということ。
正直、そんな違わないでしょ、っていうのもあったり。。。

ってなわけで、ちょっと計測。

同一回数のappendでどの程度時間に差が発生するか?
以下、ソース。

import java.util.Random;

public class SpeedTest {

    public static void main(String[] args) {

        System.out.println("start testBuffer");
        testBuffer();

        System.out.println("start testBuilder");
        testBuilder();

    }

    static final int roopCount = 10000000;

    static void testBuffer() {

        long begin = System.currentTimeMillis();
        StringBuffer buf = new StringBuffer();
        Random rnd = new Random();
        for (int i = 0 ; i < roopCount ; ++i) {
            buf.append(rnd.nextInt(9));
        }
        long end = System.currentTimeMillis();
        System.out.println(end - begin);

    }

    static void testBuilder() {

        long begin = System.currentTimeMillis();
        StringBuilder buf = new StringBuilder();
        Random rnd = new Random();
        for (int i = 0 ; i < roopCount ; ++i) {
            buf.append(rnd.nextInt(9));
        }
        long end = System.currentTimeMillis();
        System.out.println(end - begin);

    }
}


結果は・・・・・・・

start testBuffer
425
start testBuilder
331

ループ回数を色々変えてやってみても、だいたい割合は同じくらい。
75%くらい早くなる。

synchronizedってこんなに遅いんだ、と実感。