log.metatype

Archive for February 2008

for Loop

JavaScriptのfor文の書き方のテスト。
配列の先頭から末尾までの繰り返しを行う
単純な場面を想定してみる。


for (var i = 0; i < items.length; i++);

書き方1(以下、for1)
配列の長さ分繰り返す、よく見かける書き方。


for (var i = 0, ix = items.length; i < ix; i++);

書き方2(以下、for2)
最初に配列の長さを保持して、
条件式の計算量を抑える書き方。


for (var item, i = 0; item = items[i]; i++);

書き方3(以下、for3)
条件式で配列の要素の代入をそのまま判定に使う書き方。
要素が偽になり得る配列には使えない。
while的な書き方。


それぞれを関数で包んで、
Firebugで次の様なパフォーマンステストしてみた。
配列の長さとコール数のバランスによって結果は変わりそうだけど、
まあ、適当に。

function for1 (items) {
	for (var i = 0; i < items.length; i++);
}
function for2 (items) {
	for (var i = 0, ix = items.length; i < ix; i++);
}
function for3 (items) {
	for (var item, i = 0; item = items[i]; i++);
}
var data = [];
for (var i = 0; i < 1000; i++) data.push({ n: i, s: '', d: new Date });
console.profile('profile');
for (var i = 0; i < 1000; i++) for1(data);
for (var i = 0; i < 1000; i++) for2(data);
for (var i = 0; i < 1000; i++) for3(data);
console.profileEnd();

for文だけの処理時間の結果は、

for3 (45%) > for1 (35%) > for2 (15%)

大体、こんな感じで、
for2 は for1 よりも条件式の計算の差で若干速い。
for3 は変数代入分だけコストがかかって遅い。


function for1 & for2 (items) {
	for (...) {
		items[i].n; items[i].s; items[i].d;
	}
}
function for3 (items) {
	for (...) {
		item.n; item.s; item.d;
	}
}

次に、配列の要素の中身を参照する処理を加えてテスト。

for1 (35%) = for2 (35%) > for3 (30%)

結果は大体、こんな感じで、
for1 と for2 にそこまでの差は無くて、
アクセスする階層が深いので、当然遅くなる。
一旦変数に入れれば for3 と同じだけど、
書き方は for3 が綺麗かなと思った(whileよりも繰り返し条件が見やすいし)

ちょっと複雑になると気付くのだけど、
単純な 0 〜 lenght になると愚直に for1 や for2 を書いちゃうんだよね〜
少し見直してみよう。

Consolas

テキストエディタのフォントにConsolasを使ってみた。
RegularではなくてItalicで。

OS XだからClearTypeとは見え方違うけど、
Italicにすると文学的で素敵になった(適当なイメージ)
“f” や “,” や “;” が特に素敵。いつものコードが違って見えるわぁ。

ConsolasはMicrosoft PowerPoint Viewer 2007にバンドルされている。