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:
function 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:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Kombinacijom ovih funkcija možemo lako rešiti zadati problem:
let 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:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Rešimo problem pomoću naše funkcije:
let 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:
let 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:
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);
Objasnite šta nije u redu sa ovim kodom. Prepravite kod na optimalniji.