Optimizacija potrošnje memorije u JavaScriptu

Sve kreirane promenljive se čuvaju u radnoj memoriji računara. Ponekad bezumljeno pisanje koda može naglo povećati potrošenu memoriju.

Hajde da pogledamo na primeru. Pretpostavimo da smo dobili zadatak da nađemo zbir celih brojeva od 1 do 100000000. Pretpostavimo da imamo funkciju, koja popunjava niz celim brojevima iz zadatog opsega:

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

Pretpostavimo da takođe imamo funkciju, koja nalazi zbir elemenata niza:

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

Kombinacijom ovih funkcija možemo lako rešiti zadati problem:

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

Dobili smo elegantno rešenje. U njemu, međutim, postoji problem: ono troši ogromnu količinu radne memorije.

Hajde da izračunamo. Funkcija fillArr kreira niz sa 100000000 brojeva. Neka JavaScript za svaki broj alocira 2 bajta - tada će za čuvanje našeg niza biti potrebno 200000000 bajta, što je otprilike 200 megabajta radne memorije.

Ali zapravo će biti potrebno mnogo više radne memorije zbog toga što JavaScript ima veoma velike režijske troškove pri čuvanju niza.

Razumevajući problem, lako je napraviti funkciju, koja rešava zadatak i praktično ne troši radnu memoriju:

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

Rešimo problem pomoću naše funkcije:

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

Jedan programer je dobio zadatak da nađe broj brojeva koji su deljivi bez ostatka sa 7, a nalaze se u zadatom intervalu. On ga je rešio na sledeći način:

javascriptlet arr = [];

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

console.log(arr.length);

Objasnite šta nije u redu sa ovim kodom. Prepravite kod na optimalniji.

Задание 2

Jedan programer je dobio zadatak da nađe zbir delilaca broja. On ga je rešio na sledeći način:

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

Objasnite šta nije u redu sa ovim kodom. Prepravite kod na optimalniji.