Оптимизација потрошње меморије у 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);
Објасните шта није у реду са овим кодом. Промените код у оптималнији.