JavaScriptda xotira sarfini optimallashtirish
Yaratilgan barcha o‘zgaruvchilar kompyuterning operativ xotirasida saqlanadi. Ba’zan beparvo kod yozish xotira sarfini keskin oshirishi mumkin.
Keling, buni misol orqali ko‘rib chiqaylik.
Faraz qilaylik, bizning vazifamiz
1 dan 100000000 gacha bo‘lgan
butun sonlar yig‘indisini topish.
Faraz qilaylik, bizda berilgan
oraliqdagi butun sonlar bilan
massivni to‘ldiruvchi funksiya bor:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Faraz qilaylik, shuningdek, massiv elementlari yig‘indisini topadigan funksiya ham bor:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Ushbu funksiyalarning kombinatsiyasi yordamida berilgan vazifani osongina hal qilish mumkin:
let sum = getSum(fillArr(1, 100000000));
Yechim nafis bo‘ldi. Biroq, unda muammo bor: u juda ko‘p operativ xotira sarflaydi.
Keling, hisoblaylik. fillArr funksiyasi
100000000 ta son bilan massiv yaratadi.
Faraz qilaylik, JavaScript son uchun 2 bayt
ajratadi - unda bizning massivimizni saqlash uchun
200000000 bayt, ya’ni taxminan
200 megabayt operativ xotira kerak bo‘ladi.
Lekin aslida operativ xotira ko‘proq talab qilinadi, chunki JavaScript-da massivni saqlashda juda katta qo‘shimcha xarajatlar bor.
Muammoni tushunib, vazifani hal qiladigan va amalda operativ xotira sarflamaydigan funksiyani yasash oson:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Keling, vazifani ushbu funksiya yordamida hal qilaylik:
let sum = getNumsSum(100000000);
Bir dasturchi oldiga 7 ga
qoldiqsiz bo‘linadigan, berilgan oraliqda
joylashgan sonlar miqdorini topish vazifasi qo‘yilgan edi.
U uni quyidagicha hal qildi:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Ushbu kodda nima noto‘g‘ri ekanligini tushuntiring. Kodni yanada optimalroq qilib qayta yozing.
Bir dasturchi oldiga sonning bo‘luvchilari yig‘indisini topish vazifasi qo‘yilgan edi. U uni quyidagicha hal qildi:
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);
Ushbu kodda nima noto‘g‘ri ekanligini tushuntiring. Kodni yanada optimalroq qilib qayta yozing.