Mälutarbimise optimeerimine JavaScriptis
Kõik loodud muutujad salvestatakse arvuti operatiivmällu. Mõnikord võib mõtlematu koodi kirjutamine järsult suurendada mälutarbimist.
Vaatame näidet.
Oletame, et meie ees on ülesanne leida
täisarvude summa vahemikus 1
kuni 100000000.
Oletame, et meil on funktsioon,
mis täidab massiivi
täisarvudega antud
vahemikust:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Oletame, et meil on ka funktsioon, mis leiab massiivi elementide summa:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Nende funktsioonide kombinatsiooniga saab antud ülesannet kergesti lahendada:
let sum = getSum(fillArr(1, 100000000));
Saime elegantse lahenduse. Selles on siiski probleem: see tarbib tohutut operatiivmälu.
Arvutame. Funktsioon fillArr
loob massiivi 100000000 arvuga.
Oletame, et JavaScript eraldab arvu kohta 2 baiti
- siis meie massiivi hoidmiseks kulub
200000000 baiti, see tähendab umbes
200 megabaiti operatiivmälu.
Tegelikult kulub operatiivmälu palju rohkem, kuna JavaScriptis on massiivi hoidmisel väga suured üldkulud.
Probleemist aru saades on lihtne teha funktsioon, mis lahendab ülesande ja praktiliselt ei tarbi operatiivmälu:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Lahendame ülesande meie funktsiooni abil:
let sum = getNumsSum(100000000);
Ühe programmeerija ees seisis ülesanne leida
arvude hulk, mis jaguvad jäägita
7-ga, asuvad antud
vahemikus. Ta lahendas selle järgmisel viisil:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Selgitage, mis selle koodiga valesti on. Muutke koodi optimaalsemaks.
Ühe programmeerija ees seisis ülesanne leida arvu jagajate summa. Ta lahendas selle järgmisel viisil:
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);
Selgitage, mis selle koodiga valesti on. Muutke koodi optimaalsemaks.