Optimizacija porabe pomnilnika v JavaScript

Vse ustvarjene spremenljivke so shranjene v delovnem pomnilniku računalnika. Včasih lahko nepremišljeno pisanje kode drastično poveča porabo pomnilnika.

Poglejmo si primer. Predpostavimo, da je naša naloga najti vsoto celih števil od 1 do 100000000. Recimo, da imamo funkcijo, ki zapolni tabelo s celimi števili iz danega obsega:

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

Recimo tudi, da imamo funkcijo, ki najde vsoto elementov tabele:

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

S kombinacijo teh funkcij lahko enostavno rešimo dano nalogo:

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

Rešitev je elegantna. Vendar ima težavo: porabi ogromno količino delovnega pomnilnika.

Izračunajmo. Funkcija fillArr ustvari tabelo z 100000000 števili. Predpostavimo, da JavaScript za število dodeli 2 bajta - potem bo za shranjevanje naše tabele potrebno 200000000 bajtov, kar je približno 200 megabajtov delovnega pomnilnika.

V resnici bo potrebno veliko več delovnega pomnilnika zaradi tega, ker ima JavaScript zelo velike režijske stroške pri shranjevanju tabele.

Če razumemo težavo, lahko enostavno naredimo funkcijo, ki reši nalogo in praktično ne porabi delovnega pomnilnika:

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

Rešimo nalogo z našo funkcijo:

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

Nek programer je imel nalogo najti število števil, ki so deljiva brez ostanka z 7 in se nahajajo v danem obsegu. Rešil jo je na naslednji način:

javascriptlet arr = [];

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

console.log(arr.length);

Pojasnite, kaj je narobe s to kodo. Predelajte kodo v bolj optimalno.

Задание 2

Nek programer je imel nalogo najti vsoto deliteljev števila. Rešil jo je na naslednji 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);

Pojasnite, kaj je narobe s to kodo. Predelajte kodo v bolj optimalno.