Optimering av minnesanvändning i JavaScript
Alla skapade variabler lagras i datorns arbetsminne. Ibland kan tanklös kodskrivning kraftigt öka minnesförbrukningen.
Låt oss titta på ett exempel.
Anta att vi har uppgiften att hitta
summan av heltal från 1
till 100000000.
Anta att vi har en funktion
som fyller en array
med heltal från ett givet
intervall:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Anta också att vi har en funktion som hittar summan av elementen i en array:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Med en kombination av dessa funktioner kan man enkelt lösa den givna uppgiften:
let sum = getSum(fillArr(1, 100000000));
Det blev en elegant lösning. Men det finns ett problem med den: den förbrukar enorma mängder arbetsminne.
Låt oss räkna. Funktionen fillArr
skapar en array med 100000000 tal.
Anta att JavaScript tilldelar 2 byte
per tal - då krävs det 200000000 byte
för att lagra vår array, det vill säga ungefär
200 megabyte arbetsminne.
Men i verkligheten kommer det att krävas betydligt mer arbetsminne på grund av att JavaScript har mycket stora omkostnader för att lagra arrayer.
Genom att förstå problemet är det lätt att göra en funktion som löser uppgiften och nästan inte förbrukar något arbetsminne:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Låt oss lösa uppgiften med vår funktion:
let sum = getNumsSum(100000000);
En programmerare hade uppgiften att hitta
antalet tal som är jämnt delbara med
7 inom ett givet intervall. Hen
löste det på följande sätt:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Förklara vad som är fel med den här koden. Skriv om koden till en mer optimal version.
En programmerare hade uppgiften att hitta summan av delare till ett tal. Hen löste det på följande sätt:
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);
Förklara vad som är fel med den här koden. Skriv om koden till en mer optimal version.