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