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:

javascriptfunction 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:

javascriptfunction 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:

javascriptlet 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:

javascriptfunction 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ë:

javascriptlet sum = getNumsSum(100000000);
Задание 1

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:

javascriptlet 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.

Задание 2

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:

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);

Shpjegoni, çfarë nuk shkon me këtë kod. Rindërtoni kodin në një mënyrë më optimale.