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 は同じくらいという結果。
始めて使ったけど。