Optimizimi i Konsumit të Kujtesës në JavaScript
Të gjitha variablat e krijuara ruhen në kujtesën operative të kompjuterit. Ndonjëherë shkrimi i pasjellshëm i kodit mund të rrisë shpejt kujtesën e konsumuar.
Le të shohim një shembull.
Le të themi se kemi përpara detyrën për të gjetur
shumën e numrave të plotë nga 1
deri në 100000000.
Le të themi se kemi një funksion,
që mbush një grup
me numra të plotë nga një
interval i caktuar:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Le të themi gjithashtu se kemi një funksion, që gjen shumën e elementeve të një grupi:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Me ndihmën e kombinimit të këtyre funksioneve është e lehtë të zgjidhet detyra e parashtruar:
let sum = getSum(fillArr(1, 100000000));
Doli një zgjidhje elegante. Megjithatë, në të ka një problem: ajo konsumon një sasi të madhe të kujtesës operative.
Le të llogarisim. Funksioni fillArr
krijon një grup me 100000000 numra.
Le të themi se JavaScript ndan 2 bajt
për një numër - atëherë për të ruajtur grupin tonë do të nevojiten
200000000 bajt, domethënë rreth
200 megabajt kujtesë operative.
Por në fakt, do të nevojitet shumë më e madhe kujtesë operative për shkak të faktit se në JavaScript ka shumë shpenzime të mëdha shtesë gjatë ruajtjes së grupeve.
Duke e kuptuar problemin, është e lehtë të bëhet një funksion, që zgjidh detyrën dhe praktikisht nuk konsumon kujtesë operative:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Le ta zgjidhim detyrën me ndihmën e funksionit tonë:
let sum = getNumsSum(100000000);
Para një programisti kishte detyrën për të gjetur
numrin e numrave që pjesëtohen pa mbetje me
7, që ndodhen në një
interval të caktuar. Ai e zgjidhi atë në mënyrën e mëposhtme:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Shpjegoni, çfarë nuk shkon me këtë kod. Rindërtoni kodin në një mënyrë më optimale.
Para një programisti kishte detyrën për të gjetur shumën e pjesëtuesve të një numri. Ai e zgjidhi atë në mënyrën e mëposhtme:
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);
Shpjegoni, çfarë nuk shkon me këtë kod. Rindërtoni kodin në një mënyrë më optimale.