LoginSignup
9
9

More than 5 years have passed since last update.

forEachとforとforinの速度テスト2

Last updated at Posted at 2013-03-29

追記 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
9
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9