f8g

ifとスコープの速さ

ifとor

書き方として気になったんですが、

if(!b) b = 2;
a = b + c;

a = (b || (b = 2)) + c;

と、if文を書くかどうかで速度に違いが出るのかなー、と思って計ってみました。

// case 1
var a, b, c = 1;
while(i--){
	if(!b) b = 2;
	a = b + c;
	b = null;
}

// case 2
var a, b, c = 1;
while(i--){
	a = (b || (b = 2)) + c;
	b = null;
}
fx3.5 ie8 opera10 chrome3.0
case 1 0.00001313 0.0002628 0.0001864 0.00002484
case 2 0.00001188 0.0002962 0.0002122 0.00003132

(単位はms)
どれも体感で差が出るような違いはありませんが、Firefoxだけifの方が遅いみたいですね。

スコープ

Firefoxで計ってて思ったんですが、変数のスコープも速度に影響あるんだなあ、と思ってこっちも計ってみました。

// case 3
var a, b, c = 1;
while(n--) (function(){
	a = (b || (b = 2)) + c;
	b = null;
})();

// case 4
while(n--) (function(){
	var a, b, c = 1;
	a = (b || (b = 2)) + c;
	b = null;
})();
fx3.5 ie8 opera10 chrome
0.003435 0.003586 0.001582 0.0004042
0.0001866 0.002802 0.001396 0.0003785

(単位はms)

どのブラウザでも変数定義よりスコープ辿る方がコスト高いようです。特にFirefoxだと大きな差が。俺のFirefoxどっか悪いんだろうか。

まとめ

  • ifでもorでも速度的に大差なさそうだし好きに書くのがいいです
  • 変数定義のコストを考えるよりスコープチェーンを気にした方がいいです

ソース: http://arikui.github.com/test/if_scope.html