よたらぼ(2003-11-27)[L'eclat des jours(2005-07-21)経由]
…リンク先の記事はたぶんjavaかと…
何度も書き換えを行う文字列はStringBufferってのは頭の中にはあったけれども、それだけの違いで処理時間が数分の一になるんですか。
追記・実際にやってみた。
コード - StringLoop.java
public class StringLoop { static int LOOPCOUNT = 50000; public static void main(String args[]){ long start,stop; String s = "a"; start = System.currentTimeMillis(); for(int i = 0;i < LOOPCOUNT; i++){ s += "a"; if(i % 10000 == 0){ System.out.println(i); } } stop = System.currentTimeMillis(); System.out.println("Stringの文字列追加ループにかかった時間は" + (stop - start) + "ミリ秒です"); } }
コード - StringBufferLoop.java
public class StringBufferLoop { static int LOOPCOUNT = 50000; public static void main(String args[]){ long start,stop; StringBuffer sb = new StringBuffer("a"); start = System.currentTimeMillis(); for(int i = 0;i < LOOPCOUNT; i++){ sb.append("a"); if(i % 10000 == 0){ System.out.println(i); } } stop = System.currentTimeMillis(); System.out.println("StringBufferの文字列追加ループにかかった時間は" + (stop - start) + "ミリ秒です"); } }
結果
0 10000 20000 30000 40000 Stringの文字列追加ループにかかった時間は23263ミリ秒です
0 10000 20000 30000 40000 StringBufferの文字列追加ループにかかった時間は20ミリ秒です
本当だ。
Stringの方はループの後半になるほど処理が遅くなっていった。長い文字列のnewはコストが高くなるってことか。(そりゃそうか)