Edited at

eachにまつわるエトセトラ

More than 5 years have passed since last update.

そういえば、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

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