Firefoxのin演算子がモッサリなので何とかしてみた

今日は「Firefox3.5+で、配列に対してin演算子を使うと、Firefox3に比べ5〜10倍モッサリする」という困った現象を、何とかする方法をご紹介します。

Firefox3 33
Firefox3.6 157
Firefox3.7a1pre 96
<body onload="bench()"><script>
function bench() {
    var pure  = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

    function job(ary) {
        var now = +new Date;

        for (var i = 0; i < 10000; ++i) {
            for (var j = 0; j < 10; ++j) {
                if (j in ary) {
                    ary[j];
                }
            }
        }
        return (+new Date) - now;
    }
    alert(job(pure));
}
</script></body>

うーん

何とかする方法を考えてみました。

実際に試す

<body onload="bench()"><script>
function bench() {
    var pure  = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        dirty = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; // 追加

    dirty["hoge"]=0; // 追加。プロパティ名は何でもOK

    function job(ary) {
        var now = +new Date;

        for (var i = 0; i < 10000; ++i) {
            for (var j = 0; j < 10; ++j) {
                if (j in ary) {
                    ary[j];
                }
            }
        }
        return (+new Date) - now;
    }
//  alert(job(pure));
    alert(job(pure) + ", " + job(dirty)); // 追加

}
</script></body>

上記のコードを実行すると、大体こんな感じのスコアが表示されます。

pure, dirty
Firefox3 33, 33
Firefox3.6 161, 31
Firefox3.7a1pre 96, 26
IE8 110, 109
Google Chrome5(dev) 10, 9
Opera10.50(build 3202) 8, 9

配列にオブジェクトプロパティ(hoge)を無駄に追加し、配列を汚すことで、in演算子がFirefox3並の速度でうごくようになりました。

100% バッドノウハウですね。

さて、バグとして報告するべきか

Operaには「遅いのはバグだ、直せ」という社是があるそうですが、Firefoxもそーなのかは良く知りません。
動かないワケでは無いので、こういうものかもしれませんが