[Java] StringBuilderとStringBufferの速度差
Javaには、変更可能な文字列を表すクラスとして、StringBuilderとSringBufferの2種類のクラスが存在しています。
StringBuilderは非スレッドセーフ、StringBufferはスレッドセーフ、その分StringBuilderの方がStringBufferより動作速度が速い、という点が二つのクラス間の大きな違いのようです。
いったいどれくらい速いのか、ということについて気になったので、以下のコードを実行して調べてみました。StringBuilderとStringBufferを用いて”Hello, world!”という文字列を100万回結合し、その所要時間を計測しています。
ちなみに、環境はMac OS X 10.6 + JDK5です。
StringBuilder実験用コード
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
sb.append("Hello, world!");
}
long end = System.currentTimeMillis();
System.out.println("required time: " + (end - start));
}
}
StringBuffer実験用コード
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
sb.append("Hello, world!");
}
long end = System.currentTimeMillis();
System.out.println("required time: " + (end - start));
}
}
結果
上記のプログラムを10回ずつ実行し、所要時間の平均値を計算したところ、結果は以下のようになりました。
- StringBuilder:平均132.6 msec
- StringBuffer:平均170.7 msec
StringBuilderはStringBufferの約78%の時間で処理を完了出来ていることがわかります。
Javaプログラマからすれば常識のようなのですが、上記の結果からもマルチスレッドからの文字列操作を行わない場合は、基本的にStringBuilderを使うのがよい、ということが言えそうです。一つ勉強になりました。


