Optimizacija potrošnje memorije u JavaScriptu
Sve kreirane promenljive se čuvaju u radnoj memoriji računara. Ponekad bezumljeno pisanje koda može naglo povećati potrošenu memoriju.
Hajde da pogledamo na primeru.
Pretpostavimo da smo dobili zadatak da nađemo
zbir celih brojeva od 1
do 100000000.
Pretpostavimo da imamo funkciju,
koja popunjava niz
celim brojevima iz zadatog
opsega:
javascriptfunction fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Pretpostavimo da takođe imamo funkciju, koja nalazi zbir elemenata niza:
javascriptfunction getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Kombinacijom ovih funkcija možemo lako rešiti zadati problem:
javascriptlet sum = getSum(fillArr(1, 100000000));
Dobili smo elegantno rešenje. U njemu, međutim, postoji problem: ono troši ogromnu količinu radne memorije.
Hajde da izračunamo. Funkcija fillArr
kreira niz sa 100000000 brojeva.
Neka JavaScript za svaki broj alocira 2 bajta
- tada će za čuvanje našeg niza biti potrebno
200000000 bajta, što je otprilike
200 megabajta radne memorije.
Ali zapravo će biti potrebno mnogo više radne memorije zbog toga što JavaScript ima veoma velike režijske troškove pri čuvanju niza.
Razumevajući problem, lako je napraviti funkciju, koja rešava zadatak i praktično ne troši radnu memoriju:
javascriptfunction getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Rešimo problem pomoću naše funkcije:
javascriptlet sum = getNumsSum(100000000);
Jedan programer je dobio zadatak da nađe
broj brojeva koji su deljivi bez ostatka sa
7, a nalaze se u zadatom
intervalu. On ga je rešio na sledeći način:
javascriptlet arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Objasnite šta nije u redu sa ovim kodom. Prepravite kod na optimalniji.
Jedan programer je dobio zadatak da nađe zbir delilaca broja. On ga je rešio na sledeći način:
javascriptfunction 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);
Objasnite šta nije u redu sa ovim kodom. Prepravite kod na optimalniji.