Optimización del consumo de memoria en JavaScript

Todas las variables creadas se almacenan en la memoria RAM de la computadora. A veces, escribir código sin pensar puede aumentar drásticamente el consumo de memoria.

Veamos un ejemplo. Supongamos que tenemos la tarea de encontrar la suma de números enteros desde 1 hasta 100000000. Supongamos que tenemos una función que llena un array con números enteros de un rango dado:

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

Supongamos también que tenemos una función que encuentra la suma de los elementos de un array:

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

Usando la combinación de estas funciones podemos resolver fácilmente la tarea planteada:

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

Resultó una solución elegante. Sin embargo, en ella hay un problema: consume una enorme cantidad de memoria RAM.

Hagamos un cálculo. La función fillArr crea un array con 100000000 números. Supongamos que JavaScript asigna 2 bytes por número - entonces para almacenar nuestro array se necesitarán 200000000 bytes, es decir, aproximadamente 200 megabytes de memoria RAM.

Pero en realidad, se necesitará mucha más memoria RAM debido a que en JavaScript hay grandes gastos generales al almacenar un array.

Entendiendo el problema, es fácil hacer una función que resuelva la tarea y que prácticamente no consuma memoria RAM:

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

Resolvamos la tarea usando nuestra función:

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

Un programador tenía la tarea de encontrar la cantidad de números divisibles sin resto por 7, ubicados en un intervalo dado. La resolvió de la siguiente manera:

javascriptlet arr = [];

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

console.log(arr.length);

Explique qué está mal con este código. Modifique el código a uno más óptimo.

Задание 2

Un programador tenía la tarea de encontrar la suma de los divisores de un número. La resolvió de la siguiente manera:

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

Explique qué está mal con este código. Modifique el código a uno más óptimo.