こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。

怖い話

よたらぼ(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はコストが高くなるってことか。(そりゃそうか)