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:

javascriptfunction 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:

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

Combinando queste funzioni si può facilmente risolvere il compito assegnato:

javascriptlet 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:

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

Risolviamo il problema utilizzando la nostra funzione:

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

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:

javascriptlet 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.

Задание 2

Un programmatore aveva il compito di trovare la somma dei divisori di un numero. Lo ha risolto nel modo seguente:

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

Spiegate cosa non va in questo codice. Riscrivete il codice in modo più ottimale.