Optimizarea consumului de memorie în JavaScript
Toate variabilele create sunt stocate în memoria operativă a computerului. Uneori, scrierea codului fără gândire poate crește brusc memoria consumată.
Să ne uităm la un exemplu.
Să presupunem că avem sarcina de a găsi
suma numerelor întregi de la 1
la 100000000.
Să presupunem că avem o funcție,
care umple un array
cu numere întregi dintr-un interval
dat:
javascriptfunction fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Să presupunem că avem și o funcție, care găsește suma elementelor array-ului:
javascriptfunction getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Cu o combinație a acestor funcții se poate rezolva cu ușurință sarcina:
javascriptlet sum = getSum(fillArr(1, 100000000));
S-a obținut o soluție elegantă. În ea, totuși, există o problemă: consumă o cantitate imensă de memorie operativă.
Să calculăm. Funcția fillArr
creează un array cu 100000000 numere.
Să presupunem că JavaScript alocă pentru un număr 2 biți
- atunci pentru stocarea array-ului nostru va fi necesar
200000000 de biți, adică aproximativ
200 de megabiți de memorie operativă.
Dar, de fapt, va fi necesară mult mai multă memorie operativă datorită faptului că în JavaScript există foarte mari cheltuieli generale la stocarea array-ului.
Înțelegând problema, este ușor să facem o funcție, care rezolvă sarcina și care consumă practic deloc memorie operativă:
javascriptfunction getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Să rezolvăm sarcina cu funcția noastră:
javascriptlet sum = getNumsSum(100000000);
Unui programator i s-a dat sarcina să găsească
numărul de numere divizibile fără rest la
7, aflate într-un interval dat. El a rezolvat-o în felul următor:
javascriptlet arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Explicați ce nu este în regulă cu acest cod. Rescrieți codul într-o variantă mai optimă.
Unui programator i s-a dat sarcina să găsească suma divizorilor unui număr. El a rezolvat-o în felul următor:
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);
Explicați ce nu este în regulă cu acest cod. Rescrieți codul într-o variantă mai optimă.