Аптымізацыя спажывання памяці ў 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);
Растлумачце, што не так з гэтым кодам. Перарабіце код на больш аптымальны.