StringBuilderを使うべきかどうか。

なんか、StringBuilderを使った方が速いって勘違いしている人がいるので、ぐぐってみたら↓あたりが....

この辺、StringとStringBuilderの特性を知らないで計測しているので、Stringの+演算子ががとんでもなく遅いことになっていますけど、全くそんなことないです。問題は2つあって一つがStringの書き方で最適化が効かないような書き方をしている点とStringが不得意な巨大なStringを作り出している点。

一般的にあるような文字列連結なら、最適化が効いてStringBuilderと同じようなコードに置き換えてくれるので、うん百倍の性能差が出ることは無いです。

import java.util.Date;

public class StringPerformance {
	
	public static void main(String[] args) {
		
		long start = 0;
		long loop = 1000000;

		start = now();
		for(int i = 0; i < loop; i++) {
			String s = "abcde";
			s += "1234567890";
			s += "うほうほ";
		}
		long stringResult = now()- start;
		
		start = now();
		for(int i = 0; i < loop; i++) {
			StringBuilder sb = new StringBuilder("abcde");
			sb.append("1234567890");
			sb.append("うほうほ");
			sb.toString();
		}
		long builderResult = now()- start;
		
		start = now();
		for(int i = 0; i < loop; i++) {
			StringBuffer sb = new StringBuffer("abcde");
			sb.append("1234567890");
			sb.append("うほうほ");
			sb.toString();
		}
		long bufferResult = now()- start;
		
		
		System.out.printf("String:%d, Builder:%d, Buffer:%d\n", stringResult, builderResult, bufferResult);
		
	}
	
	private static long now() {
		return new Date().getTime();
	}

}

で、結果。

String:163, Builder:78, Buffer:114

百万回実行しての差がこれだけなので、ほとんど無視してしまっていいレベルの性能差です。というかリテラルを連結する場合などは+演算子でつなげた方が速い場合もあります。なんで、Stringを連結する場合は素直に演算子でつなげて記述性を優先させておきましょう。

StringBuilderを使うべき箇所lはテンプレートエンジンを実装するときとか、巨大なStringを効率よく扱いたい場合とか特別に性能に配慮したい場合だけで十分です。

ちなみに、このバッドノウハウが広がったのは1.4系の頃に最適化の頭が悪くて、Stringの演算子を使った場合にStringBufferオブジェクトを作りまくっている問題があって、演算子の代わりにStringBufferを使うと40倍速い頃があったのが原因で今のVMはそんなことないので−。

MM-BTSH3のビープ音

週末に買ってきたBTレシーバ。iPod touch用に買ってきたのはいいのですが、電源をON/OFFするごとに本体がビープ音がなるので何この仕様ーーありえーんとか思ってたら消す方法がわかったのでその方法を書いときます。

1.電源を入れる
2.ボリュームの+-を同時に押す。
3.短く3つピピピッって鳴ったら終了。

実はマニュアルに載ってます。

http://www.sanwa.co.jp/support/setsumeisyo/download.asp?file_name=MM-BTSH3BK_W.pdf

で、晴れて快適なワイヤレス環境にはなったのですが、iPod君はプロファイルで対応していないので、再生/停止とボリュームコントロールくらいしかできません。マイクはついてますがヴォイスコントロールとかも無理です。

この辺はApple頑張ってよーと思わないでもないですが、本体を出さなくても停止できるだけで全然使い勝手が違うんですよね。アプリをいじるのにもコードが邪魔ならないし。

雲に興味がわかない理由。

なんか、世間一般的にはクラウドクラウドって騒いでいるのですが、いまいち手を出してみようって気にならないんですよね。

で、理由を考えてみたんだけど。

・ベンダーロックされた技術がイヤ。知識の使い回しが効かないし、一度始めてしまったらデータを移行できないってリスクが高すぎるような。
・コスト。クラウドの値段って単純に電気代に比例するはずなんだけど、昨今の環境の周りの動きを見ていると、仮に電気代が2倍になった場合にタダで使ってねとか言ってるのは大丈夫なのか?とか。
Googleが好きくない。
・技術的にはどちらかというとできることが増えるというよりは制限をかけてスケールを確保ししているという意味で後退・単純化しているので、情報が安定してからキャッチアップしたほうがよさげ。
・結局はAPIの呼び出しになるんじゃない?
・最終的にはPrivateでClosedなマシン数が少ない環境でスケールするクラウドと、完全にオープンでベンダ非依存の大規模なクラウドの2つに二極化していくと思うので、今あるのってそのどっちでもない気がする。

暇すぎてしょうがない状態になったら手を出すかもだけど、とりあずScalaとQTやっておくかなー。

Operaが最速の座を取り戻した日

Opera10.5がリリースされました。アホみたいにはえーーーー。

メニューバーが消えて左上にまとまったり、UIがなめらなになってるあたり、微妙にChromeの影響を受けてますがいつもどおり確実によくなってます。