Uboreshaji wa Matumizi ya Kumbukumbu katika JavaScript

Vigezo vyote vilivyoundwa huhifadhiwa katika kumbukumbu ya kufanya kazi ya kompyuta. Wakati mwingine uandishi wa koda bila kufikiria unaweza kuongeza kwa kasi kumbukumbu inayotumiwa.

Wacha tuangalie kwa mfano. Hebu tuchukulie tuna lengo la kupata jumla ya nambari kamili kutoka 1 hadi 100000000. Hebu tuchukulie tuna kazi, ambayo inajaza safu kwa nambari kamili kutoka kwa upeo uliopewa:

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

Hebu tuchukulie pia tuna kazi, ambayo inapata jumla ya vipengele vya safu:

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

Kwa kutumia mchanganyiko wa kazi hizi inawezekana kutatua kwa urahisi lengo lililowekwa:

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

Imekuwa suluhisho la kifahari. Hata hivyo, kuna tatizo: linatumia kiwango kikubwa sana cha kumbukumbu ya kufanya kaji.

Wacha tuhesabu. Kazi fillArr inaunda safu yenye 100000000 nambari. Hebu tuchukulie JavaScript inatenga 2 baiti kwa kila nambari - basi kuhifadhi safu yetu itahitaji 200000000 baiti, yaani takriban 200 megabaiti za kumbukumbu ya kufanya kazi.

Lakini kwa kweli kumbukumbu ya kufanya kaji itahitajika zaidi kutokana na ukweli kwamba katika JavaScript kuna gharama kubwa za ziada wakati wa kuhifadhi safu.

Kwa kuelewa tatizo, ni rahisi kutengeneza kazi, inayotatua tatizo na inayotumia karibu hakuna kumbukumbu ya kufanya kazi:

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

Wacha tutatue tatizo kwa kutumia kazi yetu:

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

Mbele ya programu fulani kulikuwa na lengo la kupata idadi ya nambari, zinazogawanyika bila salio kwa 7, zilizoko kwenye muda uliopewa. Aliitatua kama ifuatavyo:

javascriptlet arr = [];

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

console.log(arr.length);

Elezeni, nini kibaya na kodi hii. Badilisha kodi kuwa bora zaidi.

Задание 2

Mbele ya programu fulani kulikuwa na lengo la kupata jumla ya vigawanyiko vya nambari. Aliitatua kama ifuatavyo:

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

Elezeni, nini kibaya na kodi hii. Badilisha kodi kuwa bora zaidi.