JavaScript 메모리 사용 최적화
생성된 모든 변수는 컴퓨터의 운영 메모리에 저장됩니다. 가끔 생각 없이 코드를 작성하면 메모리 사용량이 급격히 증가할 수 있습니다.
예를 들어 살펴보겠습니다.
우리 앞에 1부터
100000000까지의 정수 합을 찾는
과제가 있다고 가정해 봅시다.
주어진 범위에서 배열을
정수로 채우는 함수가
있다고 가정합니다:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
또한 배열 요소의 합을 구하는 함수가 있다고 가정합니다:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
이 함수들의 조합을 사용하여 주어진 과제를 쉽게 해결할 수 있습니다:
let sum = getSum(fillArr(1, 100000000));
우아한 해결책이 나왔습니다. 그러나 여기에는 문제가 있습니다: 이 코드는 엄청난 양의 운영 메모리를 소비합니다.
계산해 봅시다. 함수 fillArr는
100000000개의 숫자로 배열을 생성합니다.
JavaScript가 숫자당 2바이트를 할당한다고 가정하면
- 우리 배열을 저장하는 데에는
200000000바이트, 즉 약
200메가바이트의 운영 메모리가 필요합니다.
그러나 실제로는 JavaScript에서 배열 저장 시 매우 큰 오버헤드가 발생하기 때문에 훨씬 더 많은 운영 메모리가 필요할 것입니다.
문제를 이해하면, 과제를 해결하면서도 거의 운영 메모리를 소비하지 않는 함수를 쉽게 만들 수 있습니다:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
우리 함수를 사용하여 과제를 해결해 봅시다:
let sum = getNumsSum(100000000);
어떤 프로그래머에게 주어진 범위 내에서
나머지 없이 7로 나누어 떨어지는
숫자의 개수를 찾는 과제가 있었습니다.
그는 다음과 같이 해결했습니다:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
이 코드의 문제점을 설명하세요. 코드를 더 최적화된 형태로 수정하세요.
어떤 프로그래머에게 숫자의 약수의 합을 찾는 과제가 있었습니다. 그는 다음과 같이 해결했습니다:
function getDivisors(num) {
let res = [];
for (let i = 1; i <= num; i++) {
if (num % i === 0) {
res.push(i);
}
}
return res;
}
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
let sum = getSum(getDivisors(320));
console.log(sum);
이 코드의 문제점을 설명하세요. 코드를 더 최적화된 형태로 수정하세요.