Otimização de consumo de memória em JavaScript
Todas as variáveis criadas são armazenadas na memória RAM do computador. Às vezes, escrever código sem pensar pode aumentar drasticamente o consumo de memória.
Vamos ver um exemplo.
Suponha que temos a tarefa de encontrar
a soma dos números inteiros de 1
a 100000000.
Suponha que temos uma função
que preenche um array
com números inteiros de um determinado
intervalo:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Suponha que também temos uma função que encontra a soma dos elementos de um array:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Com a combinação dessas funções podemos resolver facilmente a tarefa proposta:
let sum = getSum(fillArr(1, 100000000));
A solução ficou elegante. No entanto, ela tem um problema: consome uma quantidade enorme de memória RAM.
Vamos calcular. A função fillArr
cria um array com 100000000 números.
Suponha que o JavaScript aloque 2 bytes por número
- então, para armazenar nosso array, seriam necessários
200000000 bytes, ou seja, aproximadamente
200 megabytes de memória RAM.
Mas, na realidade, será necessária muito mais memória RAM devido ao fato de que o JavaScript tem um overhead muito grande no armazenamento de arrays.
Compreendendo o problema, é fácil criar uma função que resolve a tarefa e praticamente não consome memória RAM:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Vamos resolver a tarefa com a nossa função:
let sum = getNumsSum(100000000);
Um programador tinha a tarefa de encontrar
a quantidade de números divisíveis sem resto por
7, situados em um determinado
intervalo. Ele resolveu da seguinte forma:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Explique o que há de errado com este código. Reescreva o código de forma mais otimizada.
Um programador tinha a tarefa de encontrar a soma dos divisores de um número. Ele resolveu da seguinte forma:
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 o que há de errado com este código. Reescreva o código de forma mais otimizada.