2012年6月7日木曜日

JavaScript のビット演算は遅い?

JavaScript: The Good Parts によると JavaScript のビット演算は予想に反して、ハードレベルに近い演算からは程遠く、遅いとのこと。
JavaScript の数値オペランドである倍精度浮動小数型を整数に変換して、それから演算を行い、また倍精度浮動小数型に戻すという処理をしているため。

そのため、ビット演算を使う必要性が無いので「悪いパーツ」とされている。

しかし、JavaScriptグラフィックス で興味深い説明があった。
ビット演算を使うことによりアルゴリズムを変更できる時には、高速化に使える場合がある。
あるプロパティが存在するかどうかを示すフラグとして、変数のあるビットが立っているかどうかを見るという使い方をすることがある。

こんな例が示されている。
var search = ['big', 'young', 'white'];    // このプロパティを持った犬をさがす
for (var c = 0; c < search.length; c++) {
    if (dog[search[c]] == undefined) break;
}
if (c == search.length) {
    /* 見つかった! */
}

上記のようにしたい時は、下記のようにビット演算を使うと高速化できる。
var searchFlags = 128 + 32 + 4;    // 128: big, 32: young, 4: white を表す
if (searchFlags & dog.flags === searchFlags) {
    /* 見つかった! */
}

なるほど。「悪いパーツ」と言われているものを盲目的に切り捨ててもいけない。
というか、いろんな人の意見を聞くというのは大事なんだなぁ。


JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScriptグラフィックス ―ゲーム・スマートフォン・ウェブで使う最新テクニック


リンク:JavaScript 本:「JavaScript パターン」と「JavaScript: The Good Parts」
リンク:JavaScript のビット演算は遅くない?