Optimering van geheueverbruik in JavaScript

Alle geskape veranderlikes word gestoor in die werksgeheue van die rekenaar. Soms kan onnadenkende kode-skryf die geheueverbruik skerp laat toeneem.

Kom ons kyk na 'n voorbeeld. Gestel ons het die taak om die som van heelgetalle van 1 tot 100000000 te vind. Gestel ons het 'n funksie wat 'n array vul met heelgetalle uit 'n gegewe reeks:

javascriptfunction fillArr(a, b) {
  let res = [];
  
  for (let i = a; i <= b; i++) {
    res.push(i);
  }
  
  return res;
}

Gestel ons het ook 'n funksie wat die som van elemente in 'n array vind:

javascriptfunction getSum(arr) {
  let sum = 0;
  
  for (let elem of arr) {
    sum += elem
  }
  
  return sum;
}

Met die kombinasie van hierdie funksies kan die gestelde taak maklik opgelos word:

javascriptlet sum = getSum(fillArr(1, 100000000));

Dit is 'n elegante oplossing. Daar is egter 'n probleem: dit verbruik 'n enorme hoeveelheid werksgeheue.

Kom ons bereken. Die funksie fillArr skep 'n array met 100000000 getalle. Gestel JavaScript ken 2 grepe toe per getal - dan sal vir die stoor van ons array 200000000 grepe benodig word, dit is ongeveer 200 megagrepe werksgeheue.

Maar in werklikheid sal baie meer werksgeheue benodig word omdat JavaScript baie groot oorhoofse uitgawes het met die stoor van 'n array.

Deur die probleem te verstaan, is dit maklik om 'n funksie te maak wat die probleem oplos en byna geen werksgeheue verbruik nie:

javascriptfunction getNumsSum(max) {
  let sum = 0;
  
  for (let i = 1; i <= max; i++) {
    sum += i;
  }
  
  return sum;
}

Kom ons los die probleem op met ons funksie:

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

'n Sekere programmeur het die taak gehad om die aantal getalle te vind, wat sonder res deelbaar is deur 7, wat in 'n gegewe interval is. Hy het dit soos volg opgelos:

javascriptlet arr = [];

for (let i = 0; i <= 1000; i++) {
  if (i % 7 == 0) {
    arr.push(i);
  }
}

console.log(arr.length);

Verduidelik wat verkeerd is met hierdie kode. Herskep die kode na meer optimale.

Задание 2

'n Sekere programmeur het die taak gehad om die som van delers van 'n getal te vind. Hy het dit soos volg opgelos:

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

Verduidelik wat verkeerd is met hierdie kode. Herskep die kode na meer optimale.