Оптимизација потрошње меморије у JavaScript
Све креиране променљиве се чувају у оперативној меморији рачунара. Понекад немарно писање кода може нагло повећати потрошену меморију.
Хајде да погледамо на примеру.
Претпоставимо да је задатак пронаћи
збир целих бројева од 1
до 100000000.
Претпоставимо да имамо функцију
која попуњава низ
целим бројевима из датог
опсега:
javascriptfunction fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Претпоставимо да имамо и функцију која налази збир елемената низа:
javascriptfunction getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Комбинацијом ових функција можемо лако решити дати задатак:
javascriptlet sum = getSum(fillArr(1, 100000000));
Добили смо елегантно решење. У њему, међутим, постоји проблем: оно троши огромну количину оперативне меморије.
Хајде да израчунамо. Функција fillArr
креира низ од 100000000 бројева.
Претпоставимо да JavaScript додељује по 2 бајта
за број - тада ће за складиштење нашег низа бити потребно
200000000 бајтова, то јест отприлике
200 мегабајта оперативне меморије.
Али заправо ће бити потребно много више оперативне меморије због тога што JavaScript има веома велике режијске трошкове приликом складиштења низа.
Разумемо ли проблем, лако је направити функцију која решава задатак и практично не троши оперативну меморију:
javascriptfunction getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Решимо задатак помоћу наше функције:
javascriptlet sum = getNumsSum(100000000);
Пред неким програмером био је задатак пронаћи
број бројева који се без остатка деле са
7, који се налазе у датом
интервалу. Он га је решио на следећи начин:
javascriptlet arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Објасните шта није у реду са овим кодом. Промените код у оптималнији.
Пред неким програмером био је задатак пронаћи збир делиоца броја. Он га је решио на следећи начин:
javascriptfunction 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);
Објасните шта није у реду са овим кодом. Промените код у оптималнији.