Optimizacija porabe pomnilnika v JavaScript
Vse ustvarjene spremenljivke so shranjene v delovnem pomnilniku računalnika. Včasih lahko nepremišljeno pisanje kode drastično poveča porabo pomnilnika.
Poglejmo si primer.
Predpostavimo, da je naša naloga najti
vsoto celih števil od 1
do 100000000.
Recimo, da imamo funkcijo,
ki zapolni tabelo
s celimi števili iz danega
obsega:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Recimo tudi, da imamo funkcijo, ki najde vsoto elementov tabele:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
S kombinacijo teh funkcij lahko enostavno rešimo dano nalogo:
let sum = getSum(fillArr(1, 100000000));
Rešitev je elegantna. Vendar ima težavo: porabi ogromno količino delovnega pomnilnika.
Izračunajmo. Funkcija fillArr
ustvari tabelo z 100000000 števili.
Predpostavimo, da JavaScript za število dodeli 2 bajta
- potem bo za shranjevanje naše tabele potrebno
200000000 bajtov, kar je približno
200 megabajtov delovnega pomnilnika.
V resnici bo potrebno veliko več delovnega pomnilnika zaradi tega, ker ima JavaScript zelo velike režijske stroške pri shranjevanju tabele.
Če razumemo težavo, lahko enostavno naredimo funkcijo, ki reši nalogo in praktično ne porabi delovnega pomnilnika:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Rešimo nalogo z našo funkcijo:
let sum = getNumsSum(100000000);
Nek programer je imel nalogo najti
število števil, ki so deljiva brez ostanka z
7 in se nahajajo v danem
obsegu. Rešil jo je na naslednji način:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Pojasnite, kaj je narobe s to kodo. Predelajte kodo v bolj optimalno.
Nek programer je imel nalogo najti vsoto deliteljev števila. Rešil jo je na naslednji način:
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);
Pojasnite, kaj je narobe s to kodo. Predelajte kodo v bolj optimalno.