JavaScript에서 순환 연산 최적화하기
아주 가벼운 연산이라도 순환문 안에서 여러 번 반복되면 많은 자원을 소모할 수 있습니다.
예시를 통해 살펴보겠습니다. 다음과 같은 배열이 주어졌다고 가정해 봅시다:
let arr = [1, 2, 3, 4, 5, 6];
이 배열 요소들의 평균을 찾아봅시다. 요소들의 합을 구한 후, 그 합을 요소의 개수로 나누어야 합니다. 어떤 프로그래머가 이미 이 문제를 다음과 같은 방식으로 해결했다고 가정해 보겠습니다:
let avg = 0;
for (let elem of arr) {
avg += elem / arr.length;
}
console.log(avg);
이 해결책의 문제점을 살펴봅시다. 기술적으로 이 코드는 올바르게 작동하며 정답을 제공합니다. 수학적으로는 전체 합을 개수로 나누는 것도, 각 항을 개수로 나누는 것도 모두 정확합니다.
그러나 다른 문제가 발생합니다. 문제는 우리가 나누기 연산을 배열 요소 개수만큼 수행할 것이라는 점입니다. 결과적으로 우리는 많은 불필요한 연산을 수행하게 되는데, 왜냐하면 나누기 연산은 마지막에 한 번만, 즉 찾은 전체 합을 한 번만 나누는 것으로 처리할 수 있기 때문입니다.
코드를 최적화해 봅시다:
let sum = 0;
for (let elem of arr) {
sum += elem;
}
let avg = sum / arr.length;
console.log(avg);
다음 코드를 최적화하세요:
for (let i = 1900; i <= 2100; i++) {
let curr = new Date;
let date = new Date(i, curr.getMonth(), curr.getDate());
if (curr.getDay() === date.getDay()) {
console.log(date);
}
}
다음 코드를 최적화하세요:
let obj = {a: 10, b: 20, c: 30, d: 40, e: 50};
let sum = 0;
for (let key in obj) {
if (String(obj[key])[0] === '1' || String(obj[key])[0] === '2') {
sum += obj[key];
}
}
console.log(sum);