Optimalisatie van geheugengebruik in JavaScript
Alle gemaakte variabelen worden opgeslagen in het RAM van de computer. Soms kan onnadenkend code schrijven het geheugengebruik sterk laten toenemen.
Laten we een voorbeeld bekijken.
Stel we hebben de taak om de som
van gehele getallen van 1
tot 100000000 te vinden.
Stel we hebben een functie
die een array vult
met gehele getallen uit een opgegeven
bereik:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Stel we ook hebben een functie die de som van de elementen van een array vindt:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Met een combinatie van deze functies kan de gestelde taak eenvoudig worden opgelost:
let sum = getSum(fillArr(1, 100000000));
Het is een elegante oplossing geworden. Er zit echter een probleem in: het verbruikt een enorme hoeveelheid RAM.
Laten we eens rekenen. De functie fillArr
maakt een array met 100000000 getallen.
Stel dat JavaScript 2 bytes per getal toewijzt
- dan is er voor het opslaan van onze array
200000000 byte nodig, dus ongeveer
200 megabyte RAM.
Maar in werkelijkheid is er veel meer RAM nodig vanwege de zeer hoge overhead bij het opslaan van arrays in JavaScript.
Met inzicht in het probleem is het gemakkelijk een functie te maken die de taak oplost en praktisch geen RAM verbruikt:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Laten we de taak oplossen met onze functie:
let sum = getNumsSum(100000000);
Een programmeur kreeg de taak om het
aantal getallen dat deelbaar is door
7 zonder rest, in een opgegeven
interval te vinden. Hij loste het als volgt op:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Leg uit wat er mis is met deze code. Pas de code aan naar een meer optimale versie.
Een programmeur kreeg de taak om de som van de delers van een getal te vinden. Hij loste het als volgt op:
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);
Leg uit wat er mis is met deze code. Pas de code aan naar een meer optimale versie.