Optimizarea consumului de memorie în JavaScript

Toate variabilele create sunt stocate în memoria operativă a computerului. Uneori, scrierea codului fără gândire poate crește brusc memoria consumată.

Să ne uităm la un exemplu. Să presupunem că avem sarcina de a găsi suma numerelor întregi de la 1 la 100000000. Să presupunem că avem o funcție, care umple un array cu numere întregi dintr-un interval dat:

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

Să presupunem că avem și o funcție, care găsește suma elementelor array-ului:

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

Cu o combinație a acestor funcții se poate rezolva cu ușurință sarcina:

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

S-a obținut o soluție elegantă. În ea, totuși, există o problemă: consumă o cantitate imensă de memorie operativă.

Să calculăm. Funcția fillArr creează un array cu 100000000 numere. Să presupunem că JavaScript alocă pentru un număr 2 biți - atunci pentru stocarea array-ului nostru va fi necesar 200000000 de biți, adică aproximativ 200 de megabiți de memorie operativă.

Dar, de fapt, va fi necesară mult mai multă memorie operativă datorită faptului că în JavaScript există foarte mari cheltuieli generale la stocarea array-ului.

Înțelegând problema, este ușor să facem o funcție, care rezolvă sarcina și care consumă practic deloc memorie operativă:

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

Să rezolvăm sarcina cu funcția noastră:

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

Unui programator i s-a dat sarcina să găsească numărul de numere divizibile fără rest la 7, aflate într-un interval dat. El a rezolvat-o în felul următor:

javascriptlet arr = [];

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

console.log(arr.length);

Explicați ce nu este în regulă cu acest cod. Rescrieți codul într-o variantă mai optimă.

Задание 2

Unui programator i s-a dat sarcina să găsească suma divizorilor unui număr. El a rezolvat-o în felul următor:

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

Explicați ce nu este în regulă cu acest cod. Rescrieți codul într-o variantă mai optimă.