Optimalizácia spotreby pamäte v JavaScripte
Všetky vytvorené premenné sú uložené v operačnej pamäti počítača. Niekedy bezmyšlienkovité písanie kódu môže dramaticky zvýšiť spotrebúvanú pamäť.
Pozrime sa na príklad.
Predpokladajme, že našou úlohou je nájsť
súčet celých čísel od 1
do 100000000.
Predpokladajme, že máme funkciu,
ktorá naplní pole
celými číslami z daného
rozsahu:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Predpokladajme, že máme tiež funkciu, ktorá nájde súčet prvkov pola:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Pomocou kombinácie týchto funkcií môžeme ľahko vyriešiť zadanú úlohu:
let sum = getSum(fillArr(1, 100000000));
Výsledkom je elegantné riešenie. Má však problém: spotrebúva obrovské množstvo operačnej pamäte.
Počítajme. Funkcia fillArr
vytvára pole s 100000000 číslami.
Predpokladajme, že JavaScript alokuje na číslo 2 bajty
- potom na uloženie nášho poľa bude potrebných
200000000 bajtov, čo je približne
200 megabajtov operačnej pamäte.
V skutočnosti bude potrebná oveľa väčšia operačná pamäť kvôli veľkým režijným nákladom pri ukladaní polí v JavaScripte.
Keď pochopíme problém, je ľahké vytvoriť funkciu, ktorá úlohu vyrieši a prakticky nešpotrebúva operačnú pamäť:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Vyriešme úlohu pomocou našej funkcie:
let sum = getNumsSum(100000000);
Pred istým programátorom stála úloha nájsť
počet čísel deliteľných bezo zvyšku
7, nachádzajúcich sa v zadanom
intervale. Vyriešil ju nasledovným spôsobom:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Vysvetlite, čo je nesprávne na tomto kóde. Prepíšte kód na optimalizovanejší.
Pred istým programátorom stála úloha nájsť súčet deliteľov čísla. Vyriešil ju nasledovným spôsobom:
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);
Vysvetlite, čo je nesprávne na tomto kóde. Prepíšte kód na optimalizovanejší.