Atminties vartojimo optimizavimas JavaScript

Visi sukurti kintamieji saugomi kompiuterio operatyviojoje atmintyje. Kartais neapgalvotas kodo rašymas gali staigiai padidinti vartojamą atmintį.

Pažiūrėkime pavyzdžiu. Tarkime, kad mums tenka rasti sveikųjų skaičių sumą nuo 1 iki 100000000. Tarkime, kad turime funkciją, kuri užpildo masyvą sveikaisiais skaičiais iš nurodyto diapazono:

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

Tarkime, kad taip pat turime funkciją, kuri randa masyvo elementų sumą:

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

Naudojant šių funkcijų derinį galima lengvai išspręsti užduotį:

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

Gavosi elegantiškas sprendimas. Jame, tačiau, yra problema: jis sunaudoja didžiulį kiekį operatyviosios atminties.

Paskaičiuokime. Funkcija fillArr sukuria masyvą su 100000000 skaičiais. Tarkime, kad JavaScript skiria skaičiui 2 baitus - tada mūsų masyvo saugojimui prireiks 200000000 baitų, tai yra maždaug 200 megabaitų operatyviosios atminties.

Bet iš tikrųjų prireiks daug daugiau operatyviosios atminties dėl to, kad JavaScript turi labai didelę papildomą apkrovą saugant masyvą.

Suprantant problemą, lengva padaryti funkciją, sprendžiančią užduotį ir praktiškai nenaudojančią operatyviosios atminties:

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

Išspręskime užduotį naudodami mūsų funkciją:

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

Prieš tam tikrą programuotoją buvo užduotis rasti skaičių, kurie be liekanos dalijasi iš 7, esančių nurodytame intervale, kiekį. Jis ją išsprendė taip:

javascriptlet arr = [];

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

console.log(arr.length);

Paaiškinkite, kas negerai su šiuo kodu. Perdarykite kodą į optimalesnį.

Задание 2

Prieš tam tikrą programuotoją buvo užduotis rasti skaičiaus daliklių sumą. Jis ją išsprendė taip:

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

Paaiškinkite, kas negerai su šiuo kodu. Perdarykite kodą į optimalesnį.