2015.06.30 수정
---------------------------------------------------------------------
eval을 사용하기보다는 해당 타입으로 형변환을 추천
javascript 성능을 위해선 eval 사용을 추천하지 않습니다.
---------------------------------------------------------------------
자바스크립트의 속도 튜닝이라고 해야 할까..
요번엔 자바스크립트 사용 시 이상하게 오래걸릴 때 문제점에 대해 살펴본다.
if(bfYear == null || bfYear == "" || afYear == null || afYear == ""){
currentYear = dt.getFullYear();
currentMonth = dt.getMonth() + 1;
currentDay = dt.getDate();
}
else{
if(name == "bf"){
currentYear = bfYear;
currentMonth = bfMonth;
}
else if(name == "af"){
currentYear = afYear;
currentMonth = afMonth;
}
}
이런식의 간단한 달력을 구하기 위한 소스다. (원본 소스에서 약간만 발췌)
스크립트에서 사용자에 보일 달력을 생성한다(select박스로 년, 월, 일을 2쌍을 생성(이전 날짜, 이후 날짜를 위해))
이 때 이전 이후 날짜가 선택된 게 없다면(${param.bfYear} 등 파라미터로 보냇던 값이 없을경우)
오늘에 해당하는 날짜를 Date 객체로 가져와서 뿌려주고 있다면 그 날짜를 가져와서 select 박스를 유동적으로 생성한다.
이 때 본인은
var bfYear = "${param.bfYear}";
식으로 이전 연도, 월, 일, 이후 연도, 월, 일을 변수로 잡아놔서 그 것을 currentYear, Month 에다가 넣어줘서
for문으로 유동적으로 생성했다. 연도 동적 생성시 +-2년 생성을 위해
for ( var i = currentYear - intNum; i <= currentYear + intNum; i++) {
}
위와같이 연도를 생성했다. 허나 이 부분에서 자바스크립트는 현저히 속도가 저하된다.
왜냐면 bfYear, afYear로 넣은 값을 별다른 처리 없이 for문을 통해 돌렷기 때문이다.
여기서 eval 함수를 써서 처리 해줘야 정상적으로 동작한다.
eval()함수란? 문자열을 수식으로 인식해서 처리되어 반환 해주는 역할
아마 eval 함수 처리를 안해주면 for문에서 currentYear - intNum 과의 계산 시 내부적으로
문자와 숫자 사이의 parse를 한 후 계산을 하여 for문을 돌리므로 이렇게 시간이 많이 경과하는 것 같다.
이에 대해 경과시간 테스트를 해봤는데
정상 처리인 경우 20 mili, 처리를 안했을 경우 약 980 mili 차이가 났으며 실제 체감 속도는
사용자가 이벤트 버튼을 눌러 다시 응답화면을 보기까지 4~5초 소요 될 정도로 크게 차이났다.
아마 스크립트에서 성능 저하가 일어난다면 이부분을 확인해보면 어느 정도 잡히지 않을까 싶다.
'Javascript' 카테고리의 다른 글
ajax로 통신 시 로딩 처리 (0) | 2012.07.16 |
---|---|
홈페이지에 SNS공유 버튼 달기 (0) | 2012.07.15 |
기간체크 validate (0) | 2012.06.28 |
경과시간 체크 (0) | 2011.11.28 |
일정간격으로 실행(setTimeout(), setInterval()) (0) | 2011.02.08 |