JavaScript 메모리 사용 최적화

생성된 모든 변수는 컴퓨터의 운영 메모리에 저장됩니다. 가끔 생각 없이 코드를 작성하면 메모리 사용량이 급격히 증가할 수 있습니다.

예를 들어 살펴보겠습니다. 우리 앞에 1부터 100000000까지의 정수 합을 찾는 과제가 있다고 가정해 봅시다. 주어진 범위에서 배열을 정수로 채우는 함수가 있다고 가정합니다:

javascriptfunction fillArr(a, b) {
  let res = [];
  
  for (let i = a; i <= b; i++) {
    res.push(i);
  }
  
  return res;
}

또한 배열 요소의 합을 구하는 함수가 있다고 가정합니다:

javascriptfunction getSum(arr) {
  let sum = 0;
  
  for (let elem of arr) {
    sum += elem
  }
  
  return sum;
}

이 함수들의 조합을 사용하여 주어진 과제를 쉽게 해결할 수 있습니다:

javascriptlet sum = getSum(fillArr(1, 100000000));

우아한 해결책이 나왔습니다. 그러나 여기에는 문제가 있습니다: 이 코드는 엄청난 양의 운영 메모리를 소비합니다.

계산해 봅시다. 함수 fillArr는 100000000개의 숫자로 배열을 생성합니다. JavaScript가 숫자당 2바이트를 할당한다고 가정하면 - 우리 배열을 저장하는 데에는 200000000바이트, 즉 약 200메가바이트의 운영 메모리가 필요합니다.

그러나 실제로는 JavaScript에서 배열 저장 시 매우 큰 오버헤드가 발생하기 때문에 훨씬 더 많은 운영 메모리가 필요할 것입니다.

문제를 이해하면, 과제를 해결하면서도 거의 운영 메모리를 소비하지 않는 함수를 쉽게 만들 수 있습니다:

javascriptfunction getNumsSum(max) {
  let sum = 0;
  
  for (let i = 1; i <= max; i++) {
    sum += i;
  }
  
  return sum;
}

우리 함수를 사용하여 과제를 해결해 봅시다:

javascriptlet sum = getNumsSum(100000000);
Задание 1

어떤 프로그래머에게 주어진 범위 내에서 나머지 없이 7로 나누어 떨어지는 숫자의 개수를 찾는 과제가 있었습니다. 그는 다음과 같이 해결했습니다:

javascriptlet arr = [];

for (let i = 0; i <= 1000; i++) {
  if (i % 7 == 0) {
    arr.push(i);
  }
}

console.log(arr.length);

이 코드의 문제점을 설명하세요. 코드를 더 최적화된 형태로 수정하세요.

Задание 2

어떤 프로그래머에게 숫자의 약수의 합을 찾는 과제가 있었습니다. 그는 다음과 같이 해결했습니다:

javascriptfunction 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);

이 코드의 문제점을 설명하세요. 코드를 더 최적화된 형태로 수정하세요.