Optimalisering av minneforbruk i JavaScript
Alle opprettede variabler lagres i datamaskinens RAM. Noen ganger kan tankeløs kodeskriving øke minneforbruket kraftig.
La oss se på et eksempel.
Anta at vi har en oppgave å finne
summen av heltall fra 1
til 100000000.
Anta at vi har en funksjon
som fyller en matrise
med heltall fra et gitt
område:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Anta at vi også har en funksjon som finner summen av elementene i en matrise:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Ved å kombinere disse funksjonene kan man enkelt løse den gitte oppgaven:
let sum = getSum(fillArr(1, 100000000));
Det ble en elegant løsning. Den har imidlertid et problem: den bruker enormt mengde RAM.
La oss regne på det. Funksjonen fillArr
oppretter en matrise med 100000000 tall.
Anta at JavaScript tildeler 2 byte per tall
- da vil lagring av matrisen vår kreve
200000000 byte, det vil si omtrent
200 megabyte RAM.
Men i virkeligheten vil det kreves mye mer RAM fordi JavaScript har svært høye overheadkostnader ved lagring av matriser.
Når man forstår problemet, er det enkelt å lage en funksjon som løser oppgaven og praktisk talt ikke bruker RAM:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
La oss løse oppgaven med funksjonen vår:
let sum = getNumsSum(100000000);
En programmerer hadde oppgaven å finne
antall tall som er delelige uten rest på
7, innenfor et gitt
intervall. Han løste den på følgende måte:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Forklar hva som er galt med denne koden. Omgjør koden til en mer optimal en.
En programmerer hadde oppgaven å finne summen av divisorer til et tall. Han løste den på følgende måte:
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 hva som er galt med denne koden. Omgjør koden til en mer optimal en.