Optimering af hukommelsesforbrug i JavaScript
Alle oprettede variable lagres i computerens RAM. Sommetider kan tankeløs kodning pludseligt øge det forbrugte hukommelsesforbrug.
Lad os se på et eksempel.
Antag at vores opgave er at finde
summen af heltal fra 1
til 100000000.
Antag at vi har en funktion,
som fylder et array
med heltal fra et givet
interval:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Antag at vi også har en funktion, som finder summen af elementerne i et array:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Ved at kombinere disse funktioner kan opgaven let løses:
let sum = getSum(fillArr(1, 100000000));
Det blev en elegant løsning. Den har dog et problem: den forbruger enormt megen RAM.
Lad os beregne. Funktionen fillArr
opretter et array med 100000000 tal.
Antag at JavaScript allokerer 2 bytes
per tal - så vil lagring af vores array kræve
200000000 bytes, hvilket er omkring
200 megabyte RAM.
Men i virkeligheden vil det kræve meget mere RAM, fordi JavaScript har meget høje omkostninger ved lagring af arrays.
Ved at forstå problemet er det nemt at lave en funktion, som løser opgaven og praktisk talt ikke forbruger RAM:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Lad os løse opgaven med vores funktion:
let sum = getNumsSum(100000000);
En programmør stod overfor opgaven at finde
antallet af tal, der er delelige med
7, i et givet
interval. Han løste den på følgende måde:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Forklar, hvad der er galt med denne kode. Omskriv koden til en mere optimal version.
En programmør stod overfor opgaven at finde summen af divisors i et tal. Han løste den på følgende måde:
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);
Forklar, hvad der er galt med denne kode. Omskriv koden til en mere optimal version.