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:
function 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:
function 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:
let 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ă:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Să rezolvăm sarcina cu funcția noastră:
let 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:
let 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:
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);
Explicați ce nu este în regulă cu acest cod. Rescrieți codul într-o variantă mai optimă.