Speicheroptimierung in JavaScript

Alle erstellten Variablen werden im Arbeitsspeicher des Computers gespeichert. Manchmal kann gedankenloses Programmieren den Speicherverbrauch stark erhöhen.

Schauen wir uns ein Beispiel an. Nehmen wir an, die Aufgabe besteht darin, die Summe der ganzen Zahlen von 1 bis 100000000 zu finden. Nehmen wir an, wir haben eine Funktion, die ein Array mit ganzen Zahlen aus einem bestimmten Bereich füllt:

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

Nehmen wir außerdem an, wir haben eine Funktion, die die Summe der Elemente eines Arrays berechnet:

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

Durch die Kombination dieser Funktionen lässt sich die gestellte Aufgabe leicht lösen:

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

Es ist eine elegante Lösung geworden. Sie hat jedoch ein Problem: Sie verbraucht eine enorme Menge an Arbeitsspeicher.

Rechnen wir nach. Die Funktion fillArr erstellt ein Array mit 100000000 Zahlen. Nehmen wir an, JavaScript weist für eine Zahl 2 Bytes zu - dann werden für die Speicherung unseres Arrays 200000000 Bytes benötigt, also etwa 200 Megabyte Arbeitsspeicher.

Tatsächlich wird jedoch viel mehr Arbeitsspeicher benötigt, weil JavaScript sehr hohe Speicher-Overheads für die Array-Speicherung hat.

Wenn man das Problem versteht, kann man leicht eine Funktion schreiben, die die Aufgabe löst und praktisch keinen Arbeitsspeicher verbraucht:

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

Lösen wir die Aufgabe mit unserer Funktion:

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

Ein Programmierer hatte die Aufgabe, die Anzahl der Zahlen, die ohne Rest durch 7 teilbar sind, in einem bestimmten Intervall zu finden. Er löste sie wie folgt:

javascriptlet arr = [];

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

console.log(arr.length);

Erklären Sie, was an diesem Code nicht optimal ist. Schreiben Sie den Code in eine speicheroptimiertere Version um.

Задание 2

Ein Programmierer hatte die Aufgabe, die Summe der Teiler einer Zahl zu finden. Er löste sie wie folgt:

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

Erklären Sie, was an diesem Code nicht optimal ist. Schreiben Sie den Code in eine speicheroptimiertere Version um.