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:
function 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ą:
function 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į:
let 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:
function 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ą:
let sum = getNumsSum(100000000);
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:
let 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į.
Prieš tam tikrą programuotoją buvo užduotis rasti skaičiaus daliklių sumą. Jis ją išsprendė taip:
function 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į.