そういえば、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
なので、ちょっと古いですが。。。