javascriptTweet前回に「関数の引数を存在確認するための高速化Tips」と題したエントリーを書きましたが、その後にgakkieからいろいろ意見をいただきました。ついでに、10万回で50msの違いっていうのはJSにおいて重要なのかがちょっと気になったお。考えたとき、その確認方法によっては速度が変わることがある」と、いうことが一番言いたかったんだな、、ということに自己完結。確認方法についても「関数呼び出しを行う時間を含める/含めない、によっても純粋な判定時間とはずれる?」と、いう話にもなったり。いうことで「関数呼び出しを含まない」「真偽の2パターン」を考慮してもう一度測定し直してみました。検証コードは次のとおり。})(/*'foo'*/);存在確認の中では関数呼び出しは行わないように。無かったらfalseの場合で比較。単位は1000万回実行したときの秒数です。実行環境はFedora7上のSpiderMonkeyです。前回と結局のところ内容はほぼ変わりませんが、面白い点もいくつかあります。同じ比較方法の場合、if文よりも三項演算子の方がやや速いもっとも高速な方法は論理和を使う方法もっとも時間がかかる方法は型比較をif文で行う方法null比較、型比較で三項演算子を利用すると真偽によって速度が(割と)変わる三項演算子を使うと速さが変わるのは前回のエントリでHaraさんがTBくれて言及していただけました。if文は「文」なのに対し、三項演算子は「式」なので、解釈系(インタプリタ)や翻訳系(コンパイラ)が分岐除去の最適化をしやすいんじゃないかと思います。works文よりも単純な構成である式の方が分岐除去の最適化が効いてくるんじゃないか?な推測。うーん、コンパイラな下地がある方のお言葉はありがたい。あと、型比較やnull比較において真偽で時間に差がついてきちゃうのも、分岐除去にクセがあるのかもしれないですね。このあたりの話はSpiderMonkeyのソース読めば追いかけられるのかなぁ。今後ちゃんと読んでみよう。いえば、某大手Webサービスのエンジニアの中には、三項演算子マニア?がいるそうで、ほぼ全ての分岐は三項演算子で書くとか(!)ざっくりまとめJavaScriptでは簡単な分岐なら三項演算子を積極的に使っても損は無いと思います。変数の初期化なんかは論理和演算子での初期化も良さそう。違いを見てみたいなぁ。翻訳系の方が直感的に考えても分岐除去の最適化を頑張ってくれてるはずなので、差が無いと思うんだけども。これも今度ベンチとってみよう。