追記 20120329:その後、調べ直した結果 forEachよりforが早いというのが今の私の評価です。
参照>ブラウザ上とDeveloperコンソール上でのJS速度比較
http://qiita.com/items/cf8d031f2d234aff73c9
forEach と for と forin の速度比較を試したら forEachが早かった http://goo.gl/u54Yq のですが、forEachよりforが早いというベンチを教えてもらいました。http://jsperf.com/lo-dash-each-vs-native-foreach/3
ぱっとみですが、これは、コールバックで計測していることと、ライブラリを同時にテストしてるようですが、この手のコールバック処理するケースを試してみました。
でも、やっぱ forEach が早い。うーん。。。と思って、ライブラリを含んだテストをしたら、forが早くなりました。> http://socketapi.com/jsbu/forBench/test1.htm
うーん。うーん。仮説:Devコンソールのforなどの速度とブラウザ上の速度が違う?
先方のコードは次の通り。
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.1/underscore-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/0.8.2/lodash.min.js"></script>
<script>
var lodash = _.noConflict();
var pi = Math.PI,
a = "t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t".split(","), e;
</script>
<script>
//Lo-Dash each
lodash.each(a, function(item) {
item = pi;
});
//Underscore each
_.each(a, function(item) {
item = pi;
});
//Native forEach
a.forEach(function(item) {
item = pi;
});
//Native for
var cb = function(item) {
item = pi;
};
for (var ix = 0; ix < a.length; ix++) {
cb(a[ix]);
}
//Native forEach v2
var cb = function(item) {
item = pi;
};
a.forEach(cb);
</script>
##テストコード
ここでは、Underscore と Lo-Dash は試しません。(これらを含んだテストはここ http://socketapi.com/jsbu/forBench/test1.htm )
で、こんな感じで試してみます。
var a = [];
var loopLen = 10000;
//配列を作るa[0,1,2,3,...loopLen]
for (var i = 0; i <= loopLen; i++) a.push(i);
var aLen = a.length;
//コールバック
var cb = function (item, i) {
if (item >= loopLen) console.timeEnd('bench');
};
console.log('===== テスト =====');
//for
console.time('bench');
for (var i = 0; i < aLen; i++) {
cb(a[i]);
};
//forin
console.time('bench');
for (var i in a) {
cb(a[i]);
}
//forEach
console.time('bench');
a.forEach(function (item) {
cb(item);
});
//forEach2
console.time('bench');
a.forEach(cb);
##結果
Chrome 25.0.1364.172 m
--------------------------
===== テスト =====
bench: 24.000ms
bench: 19.000ms
bench: 10.000ms
bench: 4.000ms
Firefox 19.0.2
--------------------------
[15:13:06.654] ===== テスト =====
[15:13:06.654] bench: タイマー開始
[15:13:06.661] bench: 7ms
[15:13:06.661] bench: タイマー開始
[15:13:06.668] bench: 7ms
[15:13:06.668] bench: タイマー開始
[15:13:06.672] bench: 4ms
[15:13:06.672] bench: タイマー開始
[15:13:06.674] bench: 2ms