2012년 8월 13일 월요일

javascript에서 forEach의 성능 문제


http://jsperf.com/for-vs-foreach/9 를 보고 forEach가 정말 그렇게 느려?
라고 생각이 들어서 node 커맨드라인을 열고 아래와 같이 처 넣고 실행.
어짜피 IE에서도 안되는거 Array를 prototype 확장하여 forEach 를 만들어서 쓰곤 했다.

Array.prototype.forEach=function(callback) {
  for (var i=0,len=this.length; i<len; i++) {
    callback(this[i], i);
  }
}
그래서 이것도 넣어서 같이 돌려봤다.

--------------------------

var i, values = [], sum = 0;
for (i = 0; i < 10000; i++) {
 values[i] = i;
}

function add(val) {
  sum += val;
}

var itercount =2000;

sum=0;
time = +new Date();
for (var _i=itercount; _i>=0; _i--) {
  values.forEach(add);
}
console.log("forEach legacy:"+ (+new Date()-time));

sum=0;
time = +new Date();
for (var _i=itercount; _i>=0; _i--) {
  for (i = 0; i < values.length; i++) {
    add(values[i]);
  }
}
console.log("simple for:"+ (+new Date()-time));

Array.prototype.forEach2=function(callback) {
  for (var i=0,len=this.length; i<len; i++) {
    callback(this[i], i);
  }
}

sum=0;
time = +new Date();
for (var _i=itercount; _i>=0; _i--) {
  values.forEach2(add);
}
console.log("forEach custom:"+ (+new Date()-time));

---------------
결과는 아래와 같다.

forEach legacy:1041
simple for:295
forEach custom:215

오오 무려 prototype으로 만든 forEach 가 더 빠르다!
forEach, map, reduce, every, filter, join, 다 만들어야하나 싶네.