JavaScript-ում հիշողության սպառման օպտիմալացում
Բոլոր ստեղծված փոփոխականները պահվում են համակարգչի օպերատիվ հիշողության մեջ: Երբեմն անմտածված կոդ գրելը կարող է կտրուկ ավելացնել սպառվող հիշողությունը:
Դիտարկենք օրինակով:
Ենթադրենք, մեր առջև դրված է գտնելու
ամբողջ թվերի գումարը 1-ից
մինչև 100000000:
Ենթադրենք, մենք ունենք ֆունկցիա,
որը լցնում է զանգվածը
ամբողջ թվերով տվյալ
միջակայքից:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Ենթադրենք, մենք նաև ունենք ֆունկցիա, որը գտնում է զանգվածի տարրերի գումարը:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Այս ֆունկցիաների համադրությամբ հեշտությամբ կարելի է լուծել դրված խնդիրը:
let sum = getSum(fillArr(1, 100000000));
Ստացվել է նրբագեղ լուծում: Սակայն դրանում կա խնդիր. այն սպառում է հսկայական քանակությամբ օպերատիվ հիշողություն:
Եկեք հաշվարկենք: fillArr ֆունկցիան
ստեղծում է 100000000 թվերով զանգված:
Ենթադրենք, JavaScript-ը թվի համար հատկացնում է 2 բայթ
- ապա մեր զանգվածը պահելու համար կպահանջվի
200000000 բայթ, այսինքն՝ մոտավորապես
200 մեգաբայթ օպերատիվ հիշողություն:
Բայց իրականում օպերատիվ հիշողություն կպահանջվի ավելի շատ, քանի որ JavaScript-ում զանգվածը պահելիս առկա են շատ մեծ լրացուցիչ ծախսեր:
Խնդիրը հասկանալով՝ հեշտ է ստեղծել ֆունկցիա, որը լուծում է խնդիրը և գործնականում չի սպառում օպերատիվ հիշողություն:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Եկեք լուծենք խնդիրը մեր ֆունկցիայի միջոցով:
let sum = getNumsSum(100000000);
Որոշ ծրագրավորողի առջև դրված էր գտնելու
7-ի վրա առանց մնացորդի բաժանվող թվերի քանակը տվյալ
միջակայքում: Նա այն լուծել է հետևյալ կերպ.
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Բացատրեք, թե ինչն է սխալ այս կոդում: Վերափոխեք կոդը ավելի օպտիմալ:
Որոշ ծրագրավորողի առջև դրված էր գտնելու թվի բաժանարարների գումարը: Նա այն լուծել է հետևյալ կերպ.
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);
Բացատրեք, թե ինչն է սխալ այս կոդում: Վերափոխեք կոդը ավելի օպտիմալ: