JavaScriptда хотира сарфини оптималлаштириш
Барча яратилган ўзгарувчилар компьютернинг ишчи хотирасида сақланади. Бaъзида кодни бефаҳм ёзиш сарфланадиган хотирани keskin orthishiga olib kelishi mumkin.
Келгинг, мисолда кўрамиз.
Фароз қилайлик, биздан 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 га қолдиқсиз бўлинадиган сонларнинг
сонини топиш вазифаси турган. У уни quyidagicha yechgan:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Ушбу кодда нима но tugri ekanligini tushuntiring. Кодни янги оптималроқ вариантга ўзгартиринг.
Бир программистдан соннинг бўлувчилари йиғиндисини топиш вазифаси турган. У уни quyidagicha yechgan:
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);
Ушбу кодда нима но tugri ekanligini tushuntiring. Кодни янги оптималроқ вариантга ўзгартиринг.