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:
function 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:
function 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:
let 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:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Resolvamos la tarea usando nuestra función:
let sum = getNumsSum(100000000);
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:
let 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.
Un programador tenía la tarea de encontrar la suma de los divisores de un número. La resolvió de la siguiente manera:
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);
Explique qué está mal con este código. Modifique el código a uno más óptimo.