2013年01月14日

JavaScriptでfor文のちょっと変わった書き方(その2)

JavaScriptでfor文のちょっと変わった書き方にコメントがついたので、話を進めてみようと思います。

ノーマルな書き方
var count = getCount();
for (var i = 0; i < count; i++) {
//何かの処理
}


コメントしていただいた書き方
for (var i = getCount() - 1 ; i >= 0; --i) {
//何かの処理
}


これだとノーマルな書き方に比べて、変数1個分のメモリの節約にはなりますが、実行速度という意味ではあまり変化がなさそうです。そこで、「続・ハイパフォーマンスWebサイト」という本に書いてあった書き方と比べてみました。

続・ハイパフォーマンスWebサイト ―ウェブ高速化のベストプラクティス [大型本] / Steve Souders (著); 武舎 広幸, 福地 太郎, 武舎 るみ (翻訳); オライリージャパン (刊)
続・ハイパフォーマンスWebサイト ―ウェブ高速化のベストプラクティス [大型本] / Ste...

本に書いてあった書き方
for (var i = getCount(); --i;) {
//何かの処理
}


上記のコードをざっくり説明しておきます。for文のカッコの中は三つに分かれていて、2番目はループの継続条件を表します。また、JavaScriptでは数値の0はfalseと扱われます。つまり、カウンター変数iがどんどん減っていって0になったらループを抜けるということですね。カッコの2番目でカウンター変数iを減らしているのでカッコの3番目には何も書きません。注意しなくてはならないのが、カウンター変数iは1オリジン(例えば1〜10の値をとる)だということ。

では「ノーマルな書き方」と「本に書いてあった書き方」を実行して比べてみます。都合のいいことにjsperfというサイトに似たようなコードがあったので引用しちゃいます。

array.length vs. cached

大雑把に結果を説明すると、IE、Chrome、FireFoxあたりでは「ノーマルな書き方」が速いです。ではどれくらい速いのかというと、私の環境(Chrome24)で試したところ、ループを1億回ほど回して差が0.03秒くらいでした。実際のところ、ほとんど気にするようなレベルではありません。

JavaScriptのエンジンが条件分岐を解釈するときに違いが生まれるのでしょうか。「ノーマルな書き方」ではboolとして判断、「本に書いてあった書き方」ではintとして判断してますから。試しに、今度はfor文ではなくif文で比較してみました。if文の条件をboolにした場合とintにした場合で違いがあるのでしょうか?

"if" condition bool vs int

これまた大雑把に結果を説明すると、IE、Chromeあたりではintの方が速いです。他は同じ。なんだかよくわからない結果です。



まとめ


・for文でループを逆回しにするような書き方はあまり意味がない。むしろ可読性が下がる。
・if文の条件はintで指定するほうが良いかも?でもわざわざboolからintに変更するほどの差は出ない。

トリッキーな書き方ではなく、素直に書いたほうがトータル的に良さそうです。各ブラウザのJavaScriptエンジンを信じましょう。よろしくコンパイルしてくれます、きっと。
もちろん、サーバーサイドで実行するJavaScriptなど、特定の実行環境向けに極限チューニングする意味はあります。




タグ:javascript
posted by ぺるたご at 16:45| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。