LoginSignup
1
1

More than 5 years have passed since last update.

eachにまつわるエトセトラ

Last updated at Posted at 2013-03-01

そういえば、for-inとforEachって、どれくらいパフォーマンス違うんだろ、と思って、ベンチとってみた。

bench.js
var argv = process.argv.map(function (val) {
 return val;
});
argv.shift(); // == process.execPath が値になる
argv.shift(); // node用スクリプトのPath が値になる
var startupOptions = (function( opts ) {
  var rslt={};
  opts.forEach(function( val ){
    // hoge=hoge という書式だけを取り出してオプション扱いにする。
    if( /^([\w\d]+)=(.*)$/.test( val ) ){
      var k = RegExp.$1;
      var v = RegExp.$2;
      rslt[k] = v;
    }
  });
  return rslt;
})( argv );
//console.log( startupOptions );


// ここから

var tgt = {};
var obj = {};
for (var i = 0; i < startupOptions.count; i++) {
  if (startupOptions.double) {
    obj["foo_" + i] = "bar_" + (i * i);
  }
  else {
    obj["foo_" + i] = "bar_" + i;
  }
}

var d = new Date;
var k;
for (k in obj) {
  tgt[k] = obj[k];
}

console.log("for end", (new Date) - d);

tgt = {};
d = new Date;
Object.keys(obj).forEach(function(k) {
  tgt[k] = obj[k];
});

console.log("forEach end", (new Date) - d);
% node bench.js count=1000000 double=1
for end 1050
forEach end 1271
% node bench.js count=1000000
for end 1472
forEach end 1176

ふしぎーーーー
なお、double=1を入れた場合、70万回くらいまではforEachの方が速いのですが、80万回を超えるくらいからfor-inの方が早くなります。

因みに

% node -v
v0.8.15

なので、ちょっと古いですが。。。

1
1
0

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
1
1