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);
Бул коддо эмне туура эмес экенин түшүндүрүңүз. Кодду дагы оптималдуу кылып өзгөртүңүз.