Optimering av minnesanvändning i JavaScript

Alla skapade variabler lagras i datorns arbetsminne. Ibland kan tanklös kodskrivning kraftigt öka minnesförbrukningen.

Låt oss titta på ett exempel. Anta att vi har uppgiften att hitta summan av heltal från 1 till 100000000. Anta att vi har en funktion som fyller en array med heltal från ett givet intervall:

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

Anta också att vi har en funktion som hittar summan av elementen i en array:

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

Med en kombination av dessa funktioner kan man enkelt lösa den givna uppgiften:

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

Det blev en elegant lösning. Men det finns ett problem med den: den förbrukar enorma mängder arbetsminne.

Låt oss räkna. Funktionen fillArr skapar en array med 100000000 tal. Anta att JavaScript tilldelar 2 byte per tal - då krävs det 200000000 byte för att lagra vår array, det vill säga ungefär 200 megabyte arbetsminne.

Men i verkligheten kommer det att krävas betydligt mer arbetsminne på grund av att JavaScript har mycket stora omkostnader för att lagra arrayer.

Genom att förstå problemet är det lätt att göra en funktion som löser uppgiften och nästan inte förbrukar något arbetsminne:

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

Låt oss lösa uppgiften med vår funktion:

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

En programmerare hade uppgiften att hitta antalet tal som är jämnt delbara med 7 inom ett givet intervall. Hen löste det på följande sätt:

javascriptlet arr = [];

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

console.log(arr.length);

Förklara vad som är fel med den här koden. Skriv om koden till en mer optimal version.

Задание 2

En programmerare hade uppgiften att hitta summan av delare till ett tal. Hen löste det på följande sätt:

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

Förklara vad som är fel med den här koden. Skriv om koden till en mer optimal version.