Ottimizzazione dell'utilizzo della memoria in JavaScript
Tutte le variabili create vengono memorizzate nella memoria RAM del computer. A volte scrivere codice senza pensare può aumentare drasticamente la memoria utilizzata.
Diamo un'occhiata a un esempio.
Supponiamo di avere il compito di trovare
la somma dei numeri interi da 1
a 100000000.
Supponiamo di avere una funzione
che riempie un array
con numeri interi in un dato
intervallo:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Supponiamo di avere anche una funzione che calcola la somma degli elementi dell'array:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Combinando queste funzioni si può facilmente risolvere il compito assegnato:
let sum = getSum(fillArr(1, 100000000));
Ne risulta una soluzione elegante. Tuttavia, ha un problema: consuma un'enorme quantità di memoria RAM.
Facciamo due calcoli. La funzione fillArr
crea un array con 100000000 numeri.
Supponendo che JavaScript allochi 2 byte
per numero - allora per memorizzare il nostro array sarebbero necessari
200000000 byte, cioè circa
200 megabyte di memoria RAM.
Ma in realtà sarà necessaria molta più memoria RAM a causa degli altissimi costi generali per la memorizzazione degli array in JavaScript.
Comprendendo il problema, è facile creare una funzione che risolva il compito e consumi praticamente zero memoria RAM:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Risolviamo il problema utilizzando la nostra funzione:
let sum = getNumsSum(100000000);
Un programmatore aveva il compito di trovare
il numero di numeri divisibili senza resto per
7, in un dato
intervallo. Lo ha risolto nel modo seguente:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Spiegate cosa non va in questo codice. Riscrivete il codice in modo più ottimale.
Un programmatore aveva il compito di trovare la somma dei divisori di un numero. Lo ha risolto nel modo seguente:
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);
Spiegate cosa non va in questo codice. Riscrivete il codice in modo più ottimale.