Memóriafogyasztás optimalizálása JavaScriptben
Minden létrehozott változó a számítógép operatív memóriájában tárolódik. Néha a meggondolatlan kódírás jelentősen megnövelheti a memóriafogyasztást.
Nézzünk egy példát.
Tegyük fel, hogy az a feladatunk, hogy megkeressük
az egész számok összegét 1-től
100000000-ig.
Tegyük fel, hogy van egy függvényünk,
ami tölt egy tömböt
egész számokkal egy adott
tartományból:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Tegyük fel, hogy van egy függvényünk, ami megkeresi egy tömb elemeinek összegét:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Ezen függvények kombinálásával könnyen megoldható a feladat:
let sum = getSum(fillArr(1, 100000000));
Elegáns megoldás született. Van azonban benne egy probléma: hatalmas mennyiségű operatív memóriát fogyaszt.
Számoljunk. A fillArr függvény
létrehoz egy tömböt 100000000 számmal.
Tegyük fel, hogy a JavaScript 2 bájtot foglal le egy számnak
- ekkor a tömbünk tárolásához
200000000 bájt, azaz nagyjából
200 megabájt operatív memória kell.
De valójában jóval több operatív memóriára lesz szükség amiatt, mert a JavaScriptben nagyon nagyok az overhead költségek egy tömb tárolásakor.
A probléma megértése után könnyű készíteni egy függvényt, ami megoldja a feladatot és gyakorlatilag nem fogyaszt operatív memóriát:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Oldjuk meg a feladatot a függvényünkkel:
let sum = getNumsSum(100000000);
Egy programozónak az volt a feladata, hogy megkeresse
a maradék nélkül 7-tel osztható számok mennyiségét
egy adott intervallumban. A következő módon oldotta meg:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Magyarázza el, mi a probléma ezzel a kóddal. Írja át a kódot optimalizáltabb verzióra.
Egy programozónak az volt a feladata, hogy megkeresse egy szám osztóinak összegét. A következő módon oldotta meg:
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);
Magyarázza el, mi a probléma ezzel a kóddal. Írja át a kódot optimalizáltabb verzióra.