Optimalizace spotřeby paměti v JavaScriptu
Všechny vytvořené proměnné jsou uloženy v operační paměti počítače. Někdy bezmyšlenkovité psaní kódu může prudce zvýšit spotřebovanou paměť.
Podívejme se na příklad.
Předpokládejme, že máme za úkol najít
součet celých čísel od 1
do 100000000.
Předpokládejme, že máme funkci,
která naplní pole
celými čísly z daného
rozsahu:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Předpokládejme také, že máme funkci, která najde součet prvků pole:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Pomocí kombinace těchto funkcí lze snadno vyřešit zadaný úkol:
let sum = getSum(fillArr(1, 100000000));
Vzniklo elegantní řešení. V něm však existuje problém: spotřebovává obrovské množství operační paměti.
Pojďme si to spočítat. Funkce fillArr
vytváří pole s 100000000 čísly.
Předpokládejme, že JavaScript alokuje na číslo 2 bajty
- pak pro uložení našeho pole bude potřeba
200000000 bajtů, tedy přibližně
200 megabajtů operační paměti.
Ve skutečnosti bude potřeba mnohem více operační paměti kvůli tomu, že JavaScript má velmi velké režijní náklady při ukládání pole.
S pochopením problému lze snadno vytvořit funkci, která úkol řeší a prakticky nespotřebovává operační paměť:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Vyřešme úkol pomocí naší funkce:
let sum = getNumsSum(100000000);
Před určitým programátorem byl úkol najít
počet čísel dělitelných beze zbytku
7, nacházejících se v zadaném
intervalu. Vyřešil jej následujícím způsobem:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Vysvětlete, co je na tomto kódu špatně. Přepracujte kód na optimalizovanější.
Před určitým programátorem byl úkol najít součet dělitelů čísla. Vyřešil jej následujícím způsobem:
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);
Vysvětlete, co je na tomto kódu špatně. Přepracujte kód na optimalizovanější.