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:
function 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:
function 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:
let 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:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Lösen wir die Aufgabe mit unserer Funktion:
let sum = getNumsSum(100000000);
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:
let 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.
Ein Programmierer hatte die Aufgabe, die Summe der Teiler einer Zahl zu finden. Er löste sie wie folgt:
function 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.