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% バッドノウハウですね。